【发布时间】:2011-07-18 11:45:30
【问题描述】:
我有一个模型:
class Foo(models.Model):
attribute = models.IntegerField()
user = models.ForeignKey(user)
和模型管理员:
class FooAdmin(admin.ModelAdmin):
list_filter = ('attribute',)
在管理员中,我只显示活动用户的 Foo 对象,但属性过滤器为我提供了所有可能的属性,即使是那些不为该用户返回任何对象的属性。最后,我有很多不同的过滤器值,其中大多数对用户无用。如何将这些过滤器值限制为与用户匹配的值。
希望可以理解
干杯
解决方案: 在你的应用的 admin.py 中放:
from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec
from django.contrib.auth.models import User
from sets import Set
class CustomChoiceFilterSpec(ChoicesFilterSpec):
def __init__(self, f, request, params, model, model_admin):
super(CustomChoiceFilterSpec, self).__init__(f, request, params, model,
model_admin)
self.lookup_kwarg = '%s__attribute__exact' % f.name
self.lookup_val = request.GET.get(self.lookup_kwarg, None)
self.objects = list(Set([i.attribute for i in model.objects.filter(foo__user = request.user)])) # This is the magic line :) !
def choices(self, cl):
yield {'selected': self.lookup_val is None,
'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
'display': ('All')}
for val in self.objects:
yield {'selected': smart_unicode(val) == self.lookup_val,
'query_string': cl.get_query_string({self.lookup_kwarg: val.attribute}),
'display': val.attribute}
def title(self):
return "Attribute"
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'compact_filter', False), CustomChoiceFilterSpec))
最后一行表示这种类型的过滤器仅适用于具有“compact_filter”作为属性的对象。
所以我们把我们的模型 Foo (models.py):
attribute.compact_filter = True
【问题讨论】:
-
您找到解决方案了吗?它以前如何?我计划在晚上晚些时候试一试
-
你很高兴在你弄清楚后发布你的解决方案
标签: django django-admin