更改Django管理后台列表标题文本

15 投票
6 回答
11128 浏览
提问于 2025-04-15 13:46

我正在为Django的管理界面创建一些自定义视图,使用标准的更改列表作为过渡阶段。这一切都运行得很好,除了更改列表页面的标题是“选择要更改的对象”。在我的自定义视图中,“更改”这个词并不适合用户要进行的操作。

我找到了控制更改列表页面布局的Django模板(change_list.htmlchange_list_results.html),但我找不到标题是从哪里来的。我猜这个标题是某个视图传递过来的变量?

我该如何把这个标题改成更准确的,比如“选择对象”而不是“选择要更改的对象”?我希望这个修改能在所有更改列表视图中生效,而不仅仅是我想自定义的那些;不过如果能找到一种覆盖的方法,而不是直接修改django.contrib.admin的代码,那就更好了。

更新:我找到了负责更改列表的视图,它在django\contrib\admin\views中的main.py。在第69行有一个变量self.title(Django 1.0)。我通过编辑这一行达到了我想要的效果。

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的代码——看起来已经有一个选项可以让我想要的标题,但我不确定该怎么触发它?

6 个回答

5

对于当前版本的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
36

不确定这个方法现在是否还适用,但还有一种做法是把 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

已经有一个关于ChangeList自定义的提案:http://code.djangoproject.com/ticket/9749。这个提案将允许你修改管理应用的许多其他方面。不过,很遗憾,目前没有简单的方法来实现你的目标。

撰写回答