默认的django-admin列表过滤器

时间:2012-05-02 09:25:48

标签: django-admin

我的问题只是这个主题的扩展[问题] http://stackoverflow.com/questions/851636/default-filter-in-django-admin。

from myproject.myapp.mymodels import fieldC


class Poll(models.Model):

    fieldA = models.CharField(max_length=80, choices=CHOICES.MyCHOICES) 
    fieldB = models.ForeignKey(fieldC)

admin.py

list_display = ('fieldB__fieldc1')

Now my list filter shows four criteria All, A ,B ,C  . 

我想要的是如果超级用户登录,过滤器应显示所有四个标准All,A,B,C,如果用户不是超级用户过滤器,则只应显示All,A,B。

我怎么能实现这个目标? 这是我的实际admin.py

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

        referer = request.META.get('HTTP_REFERER', '')
        test = referer.split(request.META['PATH_INFO'])
        if test[-1] and not test[-1].startswith('?'):
            if not request.GET.has_key('patient__patient_type__exact'):

                q = request.GET.copy()
                q['patient__patient_type__exact'] = 'Real'
                request.GET = q
                request.META['QUERY_STRING'] = request.GET.urlencode()
                if not request.user.is_superuser:
                    q['patient__patient_type__exact'] = 'Real'
    return super(VisitAdmin, self).changelist_view(request, extra_context)


Thanks in advance 

1 个答案:

答案 0 :(得分:0)

我认为Django 1.4中新的FilterSpec API为您提供了所需的精确内容。 list_filter上的Check out the docs。在1.4中,您现在可以创建子类django.contrib.admin.SimpleListFilter的自定义列表过滤器,并使您能够编写自定义查找和查询集代码,并且由于传递了请求,您可以使用is_superuser进行简单的条件化。

if request.user.is_superuser:
    # pass one set of lookups
else:
    # pass a different set

仔细阅读文档中的示例代码,我认为一切都很清楚。