代码之家  ›  专栏  ›  技术社区  ›  T. Stone

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

  •  2
  • T. Stone  · 技术社区  · 15 年前

    我正在开发一个自定义的django管理过滤器规范(已经介绍了 #991926 )我的filterspec替代了foreignkey(用户)上的默认过滤器,基本上用三个唯一的选项(all、mine和others)替换了所有用户的列表。

    例如,如果我将自定义filterspec应用于字段 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)。

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   gerdemb    15 年前

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

    使用 get_query_set() 方法 FilterSpec . 例如:

    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)}
    

    我没有测试这个,但我希望你能理解。

        2
  •  0
  •   Arthur Debert    15 年前

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