【问题标题】:Alter Django admin change list title text更改 Django 管理员更改列表标题文本
【发布时间】:2010-11-21 14:39:35
【问题描述】:

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

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

我怎样才能用较少误导的东西来覆盖这个文本,例如“选择对象”而不是“选择要更改的对象”?我可以在所有更改列表视图中更改它,而不仅仅是我尝试自定义的特定视图;但如果可能的话,我更喜欢覆盖的解决方案,而不是修改 django.contrib.admin 代码。

更新:我找到了负责更改列表的视图,它是django\contrib\admin\views 中的main.py。第 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 代码的相同结果 - 看起来已经有一个选项可以像我一样拥有标题我喜欢它,但我不知道如何触发它?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    从 Django 3.1.7 开始

    我认为 OP 正在询问更改列表“内容”标题(显示在页面下方的面包屑,而不是浏览器选项卡标题中的标题)。 Django 从模型的verbose_name_plural 设置它(在模型类中设置'class Meta)。如果没有显式设置,Django 使用带有 's' 后缀的模型类名。这是来自 Django 管理员 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?

    【讨论】:

      【解决方案2】:

      您可以覆盖该方法并在 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)
      

      【讨论】:

      • 关于更改列表不更改表单
      【解决方案3】:

      不确定是否仍然相关,但另一种方法是将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)
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          已经有ChangeList定制的票:http://code.djangoproject.com/ticket/9749。这将提供更改管理应用程序的许多其他方面的能力。不幸的是,没有干净的方法可以实现您的目标。

          【讨论】:

          • 嗯,那个补丁看起来很有前途。让我们希望一切顺利。不幸的是,目前它对我没有多大好处,因为我试图坚持生产代码而不是使用 SVN。感谢您参与 - 看起来我只需要使用黑客并小心记录我的更改以供将来升级。如果它确实通过升级重置为以前的代码,那是非关键的。
          • 票 9749 九年以来是固定的。有机会隐藏这个过时的答案吗?