2013-05-15 20 views
16

enter image description hereDjango admin - ordinamento list_filter

ho 'versione' in list_filter, e voglio essere la versione più recente dopo 'All' elemento della lista. In questo caso, come si ordina l'elenco in ordine decrescente? (Tutti, 3.6.99.108,3.6.99.107 ...)

+0

Eventuali duplicati: http://stackoverflow.com/questions/3258314/how-to-sort-list-filter-labels-for-foreign-key-filters-in-django-admin – tuxcanfly

+0

@tuxcanfly vero , tuttavia questo OP contiene una risposta migliore –

risposta

23

Definire ordinamento predefinito nel modello Meta classe:

class MyModel(models.Model): 
    # some model fields here 
    class Meta: 
     ordering = ['-version',] 

Se in qualche modo non soddisfa il vostro scopo è possibile scrivere il proprio filtro elenco personalizzato:

from django.utils.translation import ugettext_lazy as _ 
from django.contrib.admin import SimpleListFilter 

class VersionFilter(SimpleListFilter): 
    title = _('version') 

    parameter_name = 'version' 

    def lookups(self, request, model_admin): 
     qs = model_admin.queryset(request) 
     return [(i, i) for i in qs.values_list('version', flat=True) \ 
            .distinct().order_by('-version')] 

    def queryset(self, request, queryset): 
     if self.value(): 
      return queryset.filter(version__exact=self.value()) 

class MyModel(ModelAdmin): 
    list_filter = (VersionFilter,) 

Se si ottiene seguente errore AttributeError: object has no attribute 'queryset' allora probabilmente si sta utilizzando Django 1.5+ uso .get_queryset() invece ad esempio,

qs = model_admin.get_queryset(request) 
+0

Oppure crea il tuo [filtro] (https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter) se questo non è desiderato il comportamento di ordinamento predefinito –

+0

@Hedde yup ho aggiunto un esempio per questo. Ho visto il tuo commento dopo aver aggiunto l'esempio del filtro personalizzato. Grazie! –

+0

@Airame Adnan, model_admin non ha il metodo 'get_queryset' (' qs = model_admin.get_queryset (request) '). Ha il metodo 'queryset'. Probabilmente è necessario cambiare risposta. – stalk