负自定义Django管理筛选器规范

负自定义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

我正在开发一个定制的Django Admin FilterSpec(已经介绍过了)。My FilterSpec取代了ForeignKey(用户)上的默认过滤器,基本上用三个选项替换了所有用户的列表:all、My和Other

例如,如果我将自定义过滤器spec应用到由创建的字段
中,它将添加一个包含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的一个很好的候选者。