如何修改Django管理员过滤器的标题

48

我有一个过滤器(默认的,不是自定义的)

是否仅仅改变过滤器的标题而不编写完全新的自定义过滤器是可能的吗?

因为我需要的唯一定制是其标题。应该有一种方法可以在不重写整个过滤器和查找的情况下做到这一点。


1
没有明显的方法,编写自定义过滤器是最简单的方法。否则,您需要覆盖 ChangeList.get_filters 或通过 Javascript 在飞行中修改标题。 - okm
3
修改JS代码将不符合Pythonic风格,难以追踪,并且在维护阶段会存在问题。 - iankit
2个回答

97

您需要创建一个自定义过滤器类,但您实际上可以实现一个自定义过滤器类工厂,您可以在任何需要具有自定义标题的过滤器的地方使用它:

您将需要拥有一个自定义的过滤器类,但是您实际上可以实现一个自定义过滤器类工厂,该工厂可用于生成任何自定义标题的过滤器。

from django.contrib import admin

def custom_titled_filter(title):
    class Wrapper(admin.FieldListFilter):
        def __new__(cls, *args, **kwargs):
            instance = admin.FieldListFilter.create(*args, **kwargs)
            instance.title = title
            return instance
    return Wrapper

在您的ModelAdmin类中进行如下操作:

list_filter = (
    ('fieldname', custom_titled_filter('My Custom Title')),
    'plain_field',
    ...
)

(请注意,自定义过滤器不仅仅是一个字段名,而是一个元组 (field_name, CustomFilterClass)。您只需从您的custom_titled_filter()工厂获取CustomFilterClass)


8
如果您想根据外键值进行过滤,您需要从admin.RelatedFieldListFilter继承。 - simpleigh
1
@lanzz:缺少闭合的 )('fieldname',custom_titled_filter('My Custom Title')), - allcaps
我建议使用custom_title_filter(title, Klass)。 - Steve Yeago
另外,create() 是垃圾。至少在1.10版本中,你只需要Klass(*args, **kwargs)。 - Steve Yeago

65

如果您在模型中为字段定义标签,您应该会在筛选选项中看到更改:比如,

is_staff = models.BooleanField(verbose_name="My Best Staff's", default=False)

"我的最佳员工"是筛选标签。


如果归因跨越长期的延伸关系,对我来说似乎不起作用 例如:区域__森林__树木__ID - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接