我正在尝试实现此代码段的新版本,使其与 Django 1.4 和 1.5 兼容
已经发展了很多,下面的代码几乎可以正常工作,只是 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),)
lookup_allowed
而且我总是从Django BaseModelAdmin 类的方法中得到这个错误......
在 django.db.models.options 中,我可以实现一个 hack 来覆盖或扩展它,self.related_fkey_lookups
但这对我来说有点太老套了。
编辑:请注意,以下几乎标准的过滤器也返回相同的错误:('venue__eat_venue', BooleanFieldListFilter)
一般来说,我的目标是我想要一个过滤器,它允许我通过 model2 相关字段的存在/不存在(Null/Not-Null)和属性值(如果 model2 相关字段存在)对对象进行排序)。这会很方便,我认为不太具体。
最后,是的,当我不为我的model1__model2__property
:-)请求此自定义过滤器时,一切正常