【问题标题】:restrain possible filters of list_filter to non-empty ones将 list_filter 的可能过滤器限制为非空过滤器
【发布时间】:2011-07-18 11:45:30
【问题描述】:

我有一个模型:

class Foo(models.Model):
   attribute = models.IntegerField()
   user = models.ForeignKey(user)

和模型管理员:

class FooAdmin(admin.ModelAdmin):
   list_filter = ('attribute',)

在管理员中,我只显示活动用户的 Foo 对象,但属性过滤器为我提供了所有可能的属性,即使是那些不为该用户返回任何对象的属性。最后,我有很多不同的过滤器值,其中大多数对用户无用。如何将这些过滤器值限制为与用户匹配的值。

希望可以理解

干杯

解决方案: 在你的应用的 admin.py 中放:

from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec
from django.contrib.auth.models import User
from sets import Set

class CustomChoiceFilterSpec(ChoicesFilterSpec):

    def __init__(self, f, request, params, model, model_admin):
        super(CustomChoiceFilterSpec, self).__init__(f, request, params, model,
                                                   model_admin)
    self.lookup_kwarg = '%s__attribute__exact' % f.name
    self.lookup_val = request.GET.get(self.lookup_kwarg, None)
    self.objects = list(Set([i.attribute for i in model.objects.filter(foo__user = request.user)])) # This is the magic line :) !

    def choices(self, cl):
        yield {'selected': self.lookup_val is None,
                'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
                'display': ('All')}
        for val in self.objects:
            yield {'selected': smart_unicode(val) == self.lookup_val,
                    'query_string': cl.get_query_string({self.lookup_kwarg: val.attribute}),
                    'display': val.attribute}

    def title(self):
        return "Attribute"
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'compact_filter', False), CustomChoiceFilterSpec)) 

最后一行表示这种类型的过滤器仅适用于具有“compact_filter”作为属性的对象。

所以我们把我们的模型 Foo (models.py):

attribute.compact_filter = True

【问题讨论】:

  • 您找到解决方案了吗?它以前如何?我计划在晚上晚些时候试一试
  • 你很高兴在你弄清楚后发布你的解决方案

标签: django django-admin


【解决方案1】:
list_filter = ['attribute_1', 'attribute_2']

为管理员设置过滤器

list_display = ('attribute_1', 'attribute_2')

为您的特定模型设置要在管理视图表中显示的属性。

如果这些输入正确,我相信您已经尝试过重新启动本地开发服务器和/或 apache,具体取决于您是在本地开发应用程序还是直接在服务器上开发应用程序。对代码文件的更改只会在重新编译后生效,这发生在文件被导入或直接调用时。如果您尚未重新启动服务器,则该文件可能尚未重新编译,因此可能没有发生更改。

我确定您已经在模型文件中编写了模型,并且在 admin.py 文件中编写了管理员的过滤器?

【讨论】:

  • 什么是attribute_1和attribute_2?我正在服务器上工作,重新启动它,将模型放入 models.py 并在 admin.py/Ok 中过滤,假设我有 3 个不同的字段属性值(attribute_1,...)。活动用户只有attribute_1 和attribute_2 的记录。我只想显示attribute_1 和attribute_2 而不是attribute_3,因为它对用户没用
【解决方案2】:

不幸的是,覆盖那些 list_filters 并不容易。

我们在编写我们自己的列表过滤器方面取得了巨大进展,正如您在这张票上看到的那样:http://code.djangoproject.com/ticket/5833 但不会在 1.3 中实现。

我所能建议的就是开始使用这个新词汇:“FilterSpec”来从能够让他们的自定义 FilterSpecs 在 SO 和 google 上工作的各种人那里找到代码 sn-ps。

Custom Filter in Django Admin on Django 1.3 or below
http://djangosnippets.org/snippets/1051/

我会以此为契机自己来搞定FilterSpecs!

【讨论】:

    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2012-04-25
    • 2012-05-15
    • 2012-11-28
    相关资源
    最近更新 更多