2013-05-15 24 views
16

enter image description hereDjango Admin - sortowanie list_filter

mam 'Wersja' w list_filter, a ja chcę być najnowsza wersja po 'All' elementu listy. W takim przypadku, w jaki sposób sortować listę malejąco? (Wszystko, 3.6.99.108,3.6.99.107 ...)

+0

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

+0

@tuxcanfly prawda , jednak ten OP posiada lepszą odpowiedź –

Odpowiedz

23

Określ domyślną kolejność w modelu Meta Klasa:

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

Jeśli jakoś nie spełnia swój cel można napisać własny filtr listy niestandardowej:

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,) 

Jeśli się następujący błąd AttributeError: object has no attribute 'queryset' następnie prawdopodobnie używasz Django 1.5+ korzystanie .get_queryset() zamiast np

qs = model_admin.get_queryset(request) 
+0

Lub utwórz własny [filtr] (https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter), jeśli to nie jest pożądanym domyślnym sposobem porządkowania –

+0

@Hedde yup Dodałem do tego przykład. Widziałem Twój komentarz po dodaniu niestandardowego przykładu filtra. Dzięki! –

+0

@Aamir Adnan, model_admin nie ma metody "get_queryset" ('qs = model_admin.get_queryset (request)'). Ma metodę 'queryset'. Prawdopodobnie trzeba zmienić odpowiedź. – stalk