Django后台的默认筛选器

119 投票
18 回答
51242 浏览
提问于 2025-04-15 11:32

我想知道怎么把默认的筛选选项从“全部”改成“待处理”。我有一个叫做 status 的字段,它有三个值:activate(激活)、pending(待处理)和 rejected(拒绝)。在Django的管理后台中,当我使用 list_filter 时,默认的筛选总是显示为“全部”,但我想让它默认显示为“待处理”。

18 个回答

22

我把ha22109上面的回答做了一些修改,让它可以通过比较 HTTP_REFERERPATH_INFO 来选择“全部”。

class MyModelAdmin(admin.ModelAdmin):

    def changelist_view(self, request, extra_context=None):

        test = request.META['HTTP_REFERER'].split(request.META['PATH_INFO'])

        if test[-1] and not test[-1].startswith('?'):
            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)
131

为了实现这个功能,并且在你的侧边栏中有一个可用的“全部”链接(也就是说,这个链接能显示所有内容,而不是只显示待处理的内容),你需要创建一个自定义的列表过滤器。这个过滤器要从 django.contrib.admin.filters.SimpleListFilter 这个类继承,并且默认情况下要过滤掉“待处理”的内容。可以参考下面的代码:

from datetime import date

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

class StatusFilter(SimpleListFilter):
    title = _('Status')

    parameter_name = 'status'

    def lookups(self, request, model_admin):
        return (
            (None, _('Pending')),
            ('activate', _('Activate')),
            ('rejected', _('Rejected')),
            ('all', _('All')),
        )

    def choices(self, cl):
        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() in ('activate', 'rejected'):
            return queryset.filter(status=self.value())    
        elif self.value() == None:
            return queryset.filter(status='pending')


class Admin(admin.ModelAdmin): 
    list_filter = [StatusFilter] 

补充说明:这个功能需要 Django 1.4 版本(感谢 Simon)

49

在编程中,有时候我们会遇到一些问题,比如代码运行得不如预期。这时候,我们可以去一些技术论坛,比如StackOverflow,寻求帮助。在这些论坛上,很多人会分享他们的经验和解决方案,帮助其他人解决类似的问题。

当你在这些论坛上提问时,记得把你的问题描述清楚,包括你遇到的错误信息、你使用的代码以及你希望实现的目标。这样,其他人才能更好地理解你的问题,并给出有效的建议。

同时,查看别人提出的问题和答案也是一个很好的学习方式。你可以从中学到很多编程技巧和解决问题的方法。

总之,技术论坛是一个互相帮助、共同学习的地方,利用好这些资源,可以让你的编程之路更加顺利。

class MyModelAdmin(admin.ModelAdmin):   

    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)

撰写回答