我正在为使用标准更改列表作为临时阶段的Django管理界面创建一些自定义视图。除了更改列表页面H1是“选择要更改的对象”之外,这样工作正常。 “更改”不是用户在我的自定义视图中执行操作的正确动词。
我找到了控制更改列表页面(change_list.html
和change_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代码的相同结果 - 看起来已经有一个选项可以让我的标题与我一样我喜欢它,但我不确定如何触发它?
答案 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)