template related queryset invalid icontains got filter_horizontal changelist_view django django-admin

related - Crear filtros personalizados para list_filter en Django Admin



django changelist_view (2)

Me gustaría hacer filtros personalizados para django admin en lugar de los normales ''is_staff'' y ''is_superuser''. He leído este list_filter en Django docs. Los filtros personalizados funcionan de esta manera:

from datetime import date from django.utils.translation import ugettext_lazy as _ from django.contrib.admin import SimpleListFilter class DecadeBornListFilter(SimpleListFilter): # Human-readable title which will be displayed in the # right admin sidebar just above the filter options. title = _(''decade born'') # Parameter for the filter that will be used in the URL query. parameter_name = ''decade'' def lookups(self, request, model_admin): """ Returns a list of tuples. The first element in each tuple is the coded value for the option that will appear in the URL query. The second element is the human-readable name for the option that will appear in the right sidebar. """ return ( (''80s'', _(''in the eighties'')), (''90s'', _(''in the nineties'')), ) def queryset(self, request, queryset): """ Returns the filtered queryset based on the value provided in the query string and retrievable via `self.value()`. """ # Compare the requested value (either ''80s'' or ''90s'') # to decide how to filter the queryset. if self.value() == ''80s'': return queryset.filter(birthday__gte=date(1980, 1, 1), birthday__lte=date(1989, 12, 31)) if self.value() == ''90s'': return queryset.filter(birthday__gte=date(1990, 1, 1), birthday__lte=date(1999, 12, 31)) class PersonAdmin(ModelAdmin): list_filter = (DecadeBornListFilter,)

Pero ya he hecho funciones personalizadas para list_display como esta:

def Student_Country(self, obj): return ''%s'' % obj.country Student_Country.short_description = ''Student-Country''

¿Es posible que pueda usar las funciones personalizadas para list_display en list_filter en lugar de escribir una nueva función personalizada para list_filter? Cualquier sugerencia o mejora es bienvenida. Necesite orientación sobre esto ... Gracias ...


De hecho, puede agregar filtros personalizados a los filtros de administración extendiendo SimpleListFilter. Por ejemplo, si desea agregar un filtro continente para ''África'' al filtro de administrador de país utilizado anteriormente, puede hacer lo siguiente:

En admin.py:

from django.contrib.admin import SimpleListFilter class CountryFilter(SimpleListFilter): title = ''country'' # or use _(''country'') for translated title parameter_name = ''country'' def lookups(self, request, model_admin): countries = set([c.country for c in model_admin.model.objects.all()]) return [(c.id, c.name) for c in countries] + [ (''AFRICA'', ''AFRICA - ALL'')] def queryset(self, request, queryset): if self.value() == ''AFRICA'': return queryset.filter(country__continent=''Africa'') if self.value(): return queryset.filter(country__id__exact=self.value()) class CityAdmin(ModelAdmin): list_filter = (CountryFilter,)


Su método list_display , devuelve una cadena, pero si lo entiendo correctamente, lo que quiere hacer es agregar un filtro que permita la selección de países de estudiantes, ¿correcto?

Para este filtro de relación simple, y de hecho también para la columna de visualización de la lista "Estudiante-País", no necesita crear una clase de filtro personalizada, ni un método de visualización de lista personalizada; esto sería suficiente:

class MyAdmin(admin.ModelAdmin): list_display = (''country'', ) list_filter = (''country'', )

La forma en que django hace list_filter , como se explica en los documentos , es primero al hacer coincidir automáticamente los campos que proporciona a las clases de filtro preconstruidas; estos filtros incluyen CharField y ForeignKey.

list_display automatiza de manera similar la población de la columna de lista de cambios utilizando el campo pasado recuperando los objetos relacionados y devolviendo el valor unicode de estos (igual que en el método que proporcionó anteriormente).