负自定义Django管理筛选器规范
我正在开发一个定制的Django Admin FilterSpec(已经介绍过了)。My FilterSpec取代了ForeignKey(用户)上的默认过滤器,基本上用三个选项替换了所有用户的列表:all、My和Other 例如,如果我将自定义过滤器spec应用到由创建的字段负自定义Django管理筛选器规范,django,django-admin,Django,Django Admin,我正在开发一个定制的Django Admin FilterSpec(已经介绍过了)。My FilterSpec取代了ForeignKey(用户)上的默认过滤器,基本上用三个选项替换了所有用户的列表:all、My和Other 例如,如果我将自定义过滤器spec应用到由创建的字段中,它将添加一个包含All、created by Me和created by Others的管理员过滤器。除其他人创建的负过滤器外,所有功能均正常运行 我一直试图通过在查询中添加\uu not来实现这一点,如下所示: def
中,它将添加一个包含All、created by Me和created by Others的管理员过滤器。除其他人创建的负过滤器外,所有功能均正常运行
我一直试图通过在查询中添加\uu not
来实现这一点,如下所示:
def choices(self, cl):
yield {
'selected': self.lookup_val == self.user.pk,
'query_string': cl.get_query_string({'%s__not' % self.field.name: self.user.pk}),
'display': capfirst('%s Others' % self.field.verbose_name)
}
Django似乎不支持这样的负面过滤。我也尝试过让它做\uu gte
和\uu lte
,但filterspec只使用它找到的第一个(gte),而丢弃另一个(lte)
任何人都知道如何通过自定义过滤器实现这样的负过滤器spec?不会使用“排除”过滤器进行反操作?此功能还不是Django代码的一部分;它计划用于1.2版。您需要将此修补程序应用于Django代码:
使用FilterSpec
的get\u query\u set()
方法。例如:
class AlunoStatus(FilterSpec):
def __init__(self, request, params, model, model_admin):
self.lookup_val = request.GET.get('exclude_value', None)
def get_query_set(self, cl, qs):
if self.lookup_val:
qs = qs.exclude(field=self.lookup_val)
return qs
def choices(self, cl):
yield {'selected': self.lookup_val is None,
'query_string': cl.get_query_string({}, ['exclude_value']),
'display': _('All')}
for choice in choices:
yield {'selected': self.lookup_val == choice,
'query_string': cl.get_query_string({'exclude_value': choice}),
'display': u"Exclude "+smart_unicode(choice)}
我没有对此进行测试,但我希望您能理解。在正常的查询中会这样做,但筛选器规范使用的格式是{'key':'value'}
->.Filter(key=value)
。这就是问题所在。:)事实上甚至不是那样这是1.2版的“中等”优先级功能。我在Django 1.0上使用了这个补丁。你知道我已经查看了Django库中的FilterSpec代码,我想知道你是从哪里得到的。目前我想我会等到它进入主干,但我肯定会留意这个get_query_set方法是否可用。它不仅没有进入1.2,而且也没有进入即将到来的1.3。然而,该补丁仍然有效,“所有”它需要的是测试和文档,所以它可能是1.4的一个很好的候选者。