2012-08-24 8 views
26

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

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 las funciones personalizadas para list_display así:

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

¿Es posible que podría utilizar 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 alguna guía sobre esto ... Gracias ...

+0

http: // stackoverflow. com/questions/12215751/can-i-make-list-filter-in-django-admin-to-only-show-referenced-foreignkeys – user956424

Respuesta

1

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 para la columna de visualización de la lista "Estudiante-País", no es necesario 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 Django list_filter, como se explica in the docs, es por primera vez por los campos de juego automáticamente le suministre a la clase de filtros pre-construidos; estos filtros incluyen CharField y ForeignKey.

list_display automatiza de manera similar a la población de la columna de la lista de cambios utilizando el campo aprobada por la recuperación de los objetos relacionados y devolver el Unicode valor de éstas (igual que en el método que ya ha proporcionado más arriba).

5

De hecho, puede agregar filtros personalizados a los filtros de administración extendiendo SimpleListFilter. Por ejemplo, si desea agregar un filtro para el continente 'África' en el filtro de administración país se ha usado 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,) 
Cuestiones relacionadas