Default filter in Django admin

前端 未结 15 1945
有刺的猬
有刺的猬 2020-11-27 10:49

How can I change the default filter choice from \'ALL\'? I have a field named as status which has three values: activate, pending and

15条回答
  •  孤街浪徒
    2020-11-27 11:12

    A slight improvement on Greg's answer using DjangoChoices, Python >= 2.5 and of course Django >= 1.4.

    from django.utils.translation import ugettext_lazy as _
    from django.contrib.admin import SimpleListFilter
    
    class OrderStatusFilter(SimpleListFilter):
        title = _('Status')
    
        parameter_name = 'status__exact'
        default_status = OrderStatuses.closed
    
        def lookups(self, request, model_admin):
            return (('all', _('All')),) + OrderStatuses.choices
    
        def choices(self, cl):
            for lookup, title in self.lookup_choices:
                yield {
                    'selected': self.value() == lookup if self.value() else lookup == self.default_status,
                    'query_string': cl.get_query_string({self.parameter_name: lookup}, []),
                    'display': title,
                }
    
        def queryset(self, request, queryset):
            if self.value() in OrderStatuses.values:
                return queryset.filter(status=self.value())
            elif self.value() is None:
                return queryset.filter(status=self.default_status)
    
    
    class Admin(admin.ModelAdmin):
        list_filter = [OrderStatusFilter] 
    

    Thanks to Greg for the nice solution!

提交回复
热议问题