首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django管理默认筛选器

Django管理默认筛选器
EN

Stack Overflow用户
提问于 2010-06-18 21:08:19
回答 9查看 13.9K关注 0票数 22

我知道我已经做到了这一点,但我不记得是怎么做到的,也找不到任何关于这方面的文档。

如何在管理员的对象列表视图上默认应用筛选器?

我有一个应用程序,其中列出报价和这些报价有一个状态(例如:接受,拒绝,等待..)。

我希望过滤器在默认情况下设置为status='accepted‘,即..

EN

回答 9

Stack Overflow用户

发布于 2012-03-15 08:13:27

一种更可重用的方法:

代码语言:javascript
复制
class DefaultFilterMixIn(admin.ModelAdmin):
    def changelist_view(self, request, *args, **kwargs):
        from django.http import HttpResponseRedirect
        if self.default_filters:
            try:
                test = request.META['HTTP_REFERER'].split(request.META['PATH_INFO'])
                if test and test[-1] and not test[-1].startswith('?'):
                    url = reverse('admin:%s_%s_changelist' % (self.opts.app_label, self.opts.module_name))
                    filters = []
                    for filter in self.default_filters:
                        key = filter.split('=')[0]
                        if not request.GET.has_key(key):
                            filters.append(filter)
                    if filters:                        
                        return HttpResponseRedirect("%s?%s" % (url, "&".join(filters)))
            except: pass
        return super(DefaultFilterMixIn, self).changelist_view(request, *args, **kwargs)            

然后在你的ModelAdmin上定义一个default_filters:

代码语言:javascript
复制
class YourModelAdmin(DefaultFilterMixIn):
    ....
    default_filters = ('snapshot__exact=0',)
票数 22
EN

Stack Overflow用户

发布于 2010-06-18 21:55:44

最后,这就是我要找的:

代码语言:javascript
复制
def changelist_view(self, request, extra_context=None):
    if not request.GET.has_key('status__exact'):
        q = request.GET.copy()
        q['status__exact'] = '1'
        request.GET = q
        request.META['QUERY_STRING'] = request.GET.urlencode()
    return super(SoumissionAdmin,self).changelist_view(request, extra_context=extra_context)

另一方面,admin类中的queryset方法不起作用。事实上,它确实会过滤结果,但它会破坏过滤功能。

我找到的解决方案也不是完美的,当使用它来选择"All/ filter“时,它是不可能的。在我的例子中,它不是戏剧性的,但它会足够好。

票数 8
EN

Stack Overflow用户

发布于 2010-06-18 21:45:08

您可以覆盖查询集

代码语言:javascript
复制
class QuoteAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        return super(QuoteAdmin,self).get_queryset(request).filter(status="accepted")

但是,通过覆盖查询集,您将无法查看状态为“已接受”的报价。

或者,您可以链接到以下URL,将筛选器添加到GET参数。

代码语言:javascript
复制
/admin/myapp/quote/?status=accepted
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3069825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档