我有一個模型:抑制list_filter可能的過濾器,非空的
class Foo(models.Model):
attribute = models.IntegerField()
user = models.ForeignKey(user)
和模型管理:
class FooAdmin(admin.ModelAdmin):
list_filter = ('attribute',)
在管理,我只是顯示的富對象活躍的用戶,但屬性過濾器給我所有可能的屬性,即使那些不返回任何對象的用戶。最後,我有很多不同的過濾器值,其中大部分對用戶來說都沒有用處。我如何限制那些過濾器值與用戶匹配的值。
希望這是可以理解的
乾杯
解決方案: 在您的應用程序投放的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'作爲屬性的對象。
所以我們把我們的模型美孚(models.py):
attribute.compact_filter = True
你找到一個解決辦法?它以前如何?我計劃在晚上晚些時候給出這個拍攝 – 2011-03-18 22:53:34
你很高興在解決問題後發佈你的解決方案 – 2011-06-02 06:03:06