我想實現的this snippet一個新的版本,使得Django的1.4 1.5自定義過濾器返回SuspiciousOperation
相當多的演變,下面的代碼幾乎工作節選它兼容和Django的返回我SuspiciousOperation錯誤。我明白我該如何破解它,但我不希望觸及Django的核心。如果你有一些建議,也歡迎:
這裏是我的過濾器:
class RelatedNullFilterSpec(FieldListFilter):
def __init__(self, field, request, params, model, model_admin, field_path):
field_root, field_name = field_path.rsplit('__', 1)
self.lookup_title = field.verbose_name
self.title = self.lookup_title
self.null_lookup_kwarg = '%s__isnull' % field_root
self.null_lookup_val = request.GET.get(self.null_lookup_kwarg, None)
self.lookup_kwarg = '%s__exact' % (field_path)
self.lookup_val = request.GET.get(self.lookup_kwarg, None)
if isinstance(field, models.fields.BooleanField):
self.lookup_choices = (
# (None, _('All')),
('1', _('Yes')),
('0', _('No')))
else:
self.lookup_choices = field.get_choices(include_blank=False)
super(RelatedNullFilterSpec, self).__init__(field, request, params, model, model_admin, field_path)
def expected_parameters(self):
return [self.lookup_kwarg, self.null_lookup_kwarg]
def choices(self, cl):
yield {'selected': self.lookup_val is None and self.null_lookup_val is None,
'query_string': cl.get_query_string({}, [self.lookup_kwarg,self.null_lookup_kwarg]),
'display': _('All')}
yield {'selected': self.lookup_val is None and self.null_lookup_val=="True",
'query_string': cl.get_query_string({self.null_lookup_kwarg:True},[self.lookup_kwarg]),
'display': _('Null')}
yield {'selected': self.lookup_val is None and self.null_lookup_val=="False",
'query_string': cl.get_query_string({self.null_lookup_kwarg:False},[self.lookup_kwarg]),
'display': _('Not Null')}
for pk_val, val in self.lookup_choices:
yield {'selected': self.lookup_val == smart_unicode(pk_val),
'query_string': cl.get_query_string({self.lookup_kwarg: pk_val},[self.null_lookup_kwarg]),
'display': val}
然後在我管理,我有以下幾點:
list_filter = ('time_added', 'time_modified', ('model1__model2__property', RelatedNullFilterSpec),)
我總是得到了這個錯誤Django BaseModelAdmin類的lookup_allowed
方法...
在django.db.models.options中,我可以實現一個hack來覆蓋或擴展self.related_fkey_lookups
,但這對我的口味來說有點太過分。
編輯:請注意,下面幾乎是標準過濾器還返回了同樣的錯誤:('venue__eat_venue', BooleanFieldListFilter)
在一般情況下,我的目標是,我想一個過濾器,可以讓我的存在/不存在MODEL2的對象進行排序(Null/Not-Null)和屬性的值(如果model2相關字段存在的話)。這將是非常方便,我不認爲太具體。
最後,是的,一切,當我不爲我的model1__model2__property
:-)