Django Admin Cookbook-6如何覆盖Django Admin后台模板?
返回目录
6.如何覆盖Django Admin后台模板?
原文链接:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-admin-templates
你可以覆盖Django Admin后台,不同页面模板来生成自定义的管理后台。你也可以只对某个特定应用或模型来覆盖某一部分模板文件。
设置你项目的Admin后台模板目录
默认Admin后台模板文件位于contrib/admin/templates/admin目录中。
为了覆盖其中的一个或多个,首先admin在项目目录中创建一个templates目录。该目录可以是您在设置DIRS的DjangoTemplates后端选项中 指定的任何目录TEMPLATES。如果您已经自定义了该'loaders'选项,请确保 'django.template.loaders.filesystem.Loader'在之前出现,'django.template.loaders.app_directories.Loader'以便模板加载系统可以在随附的自定义模板之前 找到您的自定义模板django.contrib.admin。
在此admin目录中,创建以您的应用程序命名的子目录。在这些应用程序子目录中,创建以模型命名的子目录。请注意,管理应用程序在查找目录时将小写模型名称,因此,如果要在区分大小写的文件系统上运行应用程序,请确保将目录命名为小写。
要覆盖特定应用程序的管理模板,可以从django/contrib/admin/templates/admin目录复制并编辑该模板,然后将其保存到刚创建的目录之一。
例如,如果我们想在名为的应用程序中为所有模型的更改列表视图添加工具my_app,我们将复制 contrib/admin/templates/admin/change_list.html到 templates/admin/my_app/项目目录,并进行必要的更改。
如果我们只想为名为“Page”的特定模型向更改列表视图添加工具,则可以将该文件复制到 templates/admin/my_app/page项目目录中。
覆盖与替换Admin模板
由于管理模板的模块化设计,通常既不需要也不建议更换整个模板。最好只覆盖需要更改的模板中的部分内容。
要继续上面的示例,我们想History在Page模型工具旁边添加一个新链接 。查看后,change_form.html 我们确定只需要覆盖该object-tools-items块。因此,这是我们的新产品change_form.html代码为:
{% extends "admin/change_form.html" %}
{% load i18n admin_urls %}
{% block object-tools-items %}
<li>
<a href="{% url opts|admin_urlname:'history' original.pk|admin_urlquote %}" class="historylink">{% translate "History" %}</a>
</li>
<li>
<a href="mylink/" class="historylink">My Link</a>
</li>
{% if has_absolute_url %}
<li>
<a href="{% url 'admin:view_on_site' content_type_id original.pk %}" class="viewsitelink">{% translate "View on site" %}</a>
</li>
{% endif %}
{% endblock %}
就是这样!如果我们将此文件放在templates/admin/my_app 目录中,则链接将显示在my_app中所有模型的更改表单上。
每个应用程序或模型可以覆盖的模板
并非每个contrib/admin/templates/admin下的模板都可以被应用程序或模型覆盖。以下模板页面支持应用或模型级的覆盖:
- actions.html
- app_index.html
- change_form.html
- change_form_object_tools.html
- change_list.html
- change_list_object_tools.html
- change_list_results.html
- date_hierarchy.html
- delete_confirmation.html
- object_history.html
- pagination.html
- popup_response.html
- prepopulated_fields_js.html
- search_form.html
- submit_line.html
对于那些无法以这种方式覆盖的模板,你仍然可以通过将修改后的版本放在templates/admin目录中来覆盖整个项目的模板 。这对于创建自定义404和500页面特别有用。
注意:一些Admin模板(如change_list_results.html用于呈现自定义包含标签)。这些标签可能会被覆盖,但是在这种情况下,最好创建自己的相关标签版本并为其指定一个不同的名称。这样,你可以有选择地使用它。