Default filter in Django admin

前端 未结 15 1871
有刺的猬
有刺的猬 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:15

    This may be an old thread, but thought I would add my solution as I couldn't find better answers on google searches.

    Do what (not sure if its Deminic Rodger, or ha22109) answered in the ModelAdmin for changelist_view

    class MyModelAdmin(admin.ModelAdmin):   
        list_filter = (CustomFilter,)
    
        def changelist_view(self, request, extra_context=None):
    
            if not request.GET.has_key('decommissioned__exact'):
    
                q = request.GET.copy()
                q['decommissioned__exact'] = 'N'
                request.GET = q
                request.META['QUERY_STRING'] = request.GET.urlencode()
            return super(MyModelAdmin,self).changelist_view(request, extra_context=extra_context)
    

    Then we need to create a custom SimpleListFilter

    class CustomFilter(admin.SimpleListFilter):
        title = 'Decommissioned'
        parameter_name = 'decommissioned'  # i chose to change it
    
    def lookups(self, request, model_admin):
        return (
            ('All', 'all'),
            ('1', 'Decommissioned'),
            ('0', 'Active (or whatever)'),
        )
    
    # had to override so that we could remove the default 'All' option
    # that won't work with our default filter in the ModelAdmin class
    def choices(self, cl):
        yield {
            'selected': self.value() is None,
            'query_string': cl.get_query_string({}, [self.parameter_name]),
            # 'display': _('All'),
        }
        for lookup, title in self.lookup_choices:
            yield {
                'selected': self.value() == lookup,
                'query_string': cl.get_query_string({
                    self.parameter_name: lookup,
                }, []),
                'display': title,
            }
    
    def queryset(self, request, queryset):
        if self.value() == '1':
            return queryset.filter(decommissioned=1)
        elif self.value() == '0':
            return queryset.filter(decommissioned=0)
        return queryset
    

提交回复
热议问题