【问题标题】:Negative custom Django admin FilterSpec负自定义 Django 管理员 FilterSpec
【发布时间】:2010-12-16 12:10:12
【问题描述】:

我正在开发一个自定义的 Django Admin FilterSpec(已经在 SO #991926 上介绍过)。 My FilterSpec 是 ForeignKey(User) 上默认过滤器的替代品,基本上将所有用户列表替换为三个唯一的选择,all、mine 和 others。

例如,如果我将自定义过滤器规范应用于字段created_by,它将添加一个管理员过滤器,其中包含全部、我创建和其他人创建。一切正常除了否定过滤器,由其他人创建。

我一直试图通过将__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 似乎不支持像这样在否定中过滤。我还尝试过让它执行__gte__lte,但filterspec 只使用它找到的第一个(gte),丢弃另一个(lte)。

有人知道如何通过自定义 FilterSpec 来实现这样的负过滤器吗?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    这个特性还不是 Django 代码的一部分;它计划用于 1.2 版。您需要将此补丁应用到 Django 代码:http://code.djangoproject.com/ticket/5833

    使用FilterSpecget_query_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)}
    

    我没有对此进行测试,但我希望你能明白。

    【讨论】:

    • 实际上甚至不是这样。 :) 这是 1.2 版的“中等”优先级功能。我在 Django 1.0 上使用 code.djangoproject.com/ticket/5833 的补丁。
    • 你知道我已经查看了 django 库中的 FilterSpec 代码,我想知道你是从哪里得到的。目前我想我会等到它进入后备箱,但我肯定会留意这个 get_query_set 方法是否可用。
    • 这不仅没有进入 1.2,而且也没有进入即将到来的 1.3。但是,该补丁仍然有效,并且它所需要的“全部”是测试和文档,所以它可能是 1.4 的一个很好的候选者。
    【解决方案2】:

    不会对否定工作使用“排除”过滤器吗?

    【讨论】:

    • 在普通查询中会这样,但过滤器规范使用格式{'key':'value'} -> .filter(key=value)。因此问题。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2016-12-05
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多