Alter Django管理员更改列表标题文本

时间:2009-08-21 09:36:39

标签: django django-admin

我正在为使用标准更改列表作为临时阶段的Django管理界面创建一些自定义视图。除了更改列表页面H1是“选择要更改的对象”之外,这样工作正常。 “更改”不是用户在我的自定义视图中执行操作的正确动词。

我找到了控制更改列表页面(change_list.htmlchange_list_results.html)布局的django.contrib.admin模板,但我找不到标题的提供位置。我猜它是某个地方视图传入的变量?

如何使用不那么具误导性的内容来覆盖此文本,例如'选择对象'而不是'选择要更改的对象'?我可以在所有更改列表视图中更改它,而不仅仅是我正在尝试自定义的特定视图;但我更喜欢一个覆盖的解决方案,而不是在可能的情况下修改django.contrib.admin代码。

更新:我找到了负责更改列表的视图,它是main.py中的django\contrib\admin\views。变量在第69行(Django 1.0)上为self.title。我通过编辑这一行来实现我正在寻找的结果

self.title = (self.is_popup and ugettext('Select %s') % force_unicode(self.opts.verbose_name) or ugettext('Select %s to change') % force_unicode(self.opts.verbose_name))

阅读

self.title = (self.is_popup and ugettext('Select %s') % force_unicode(self.opts.verbose_name) or ugettext('Select %s') % force_unicode(self.opts.verbose_name))

我仍然真的很想听到更好的方法来实现不涉及黑客攻击django.contrib.admin代码的相同结果 - 看起来已经有一个选项可以让我的标题与我一样我喜欢它,但我不确定如何触发它?

5 个答案:

答案 0 :(得分:15)

不确定是否仍然相关,但另一种方法是传递extra_content方法的changelist_view。例如:

from django.contrib import admin

class MyCustomAdmin(admin.ModelAdmin):

    def changelist_view(self, request, extra_context=None):
        extra_context = {'title': 'Change this for a custom title.'}
        return super(MyCustomAdmin, self).changelist_view(request, extra_context=extra_context)

答案 1 :(得分:2)

对于当前版本的Django:

class CustomChangeList(django.contrib.admin.views.main.ChangeList):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.title = 'My Cool Title'

class MyAdmin(ModelAdmin):
    def get_changelist(self, request, **kwargs):
        return CustomChangeList

答案 2 :(得分:1)

ChangeList自定义已有票证:http://code.djangoproject.com/ticket/9749。这将使您能够更改管理应用程序的许多其他方面。不幸的是,没有干净的方法来实现你的目标。

答案 3 :(得分:0)

从 Django 3.1.7 开始

我认为 OP 正在询问更改列表“内容”标题(显示在面包屑下方的页面上,而不是在浏览器选项卡标题中)。 Django 从模型的 verbose_name_plural 中设置它(在模型类的 class Meta 中设置)。如果没有明确设置,Django 使用带有 's' 后缀的模型类名。这是来自 Django admin change_list.html 的代码:

<!-- CONTENT-TITLE -->
{% block content_title %}
    <h1>{{ cl.opts.verbose_name_plural|capfirst }}</h1>
{% endblock %}

因此,如果仅设置 verbose_name_plural 对您来说还不够/工作,请考虑覆盖 change_list.html 模板并在 {% block content_title %} 中执行您的操作。如果在模板中做起来太复杂,您可以将自己的上下文数据传递给管理模板,如 SO 答案中给出的: Django how to pass custom variables to context to use in custom admin template?

答案 4 :(得分:-1)

您可以覆盖该方法并将其传递给 extra_content 中的标题,请参阅:

def change_view(self, request, object_id, form_url='', extra_context=None):

        extra_context = {'title': 'Hello Title'}

        return super(BlogAdmin, self).change_view(request, object_id,
            form_url, extra_context=extra_context)