Django后台的默认筛选器
我想知道怎么把默认的筛选选项从“全部”改成“待处理”。我有一个叫做 status
的字段,它有三个值:activate
(激活)、pending
(待处理)和 rejected
(拒绝)。在Django的管理后台中,当我使用 list_filter
时,默认的筛选总是显示为“全部”,但我想让它默认显示为“待处理”。
18 个回答
22
我把ha22109上面的回答做了一些修改,让它可以通过比较 HTTP_REFERER
和 PATH_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)