在 django admin 中覆盖模板

Posted

技术标签:

【中文标题】在 django admin 中覆盖模板【英文标题】:Override template in django admin 【发布时间】:2017-08-23 09:44:16 【问题描述】:

我使用的是 Django 1.11

    我能够扩展/覆盖一个名为change_form.html的模板

    我把这个文件放在/templates/admin/my_app/my_model/

    为此,我扩展并更改了一个块,例如 django 文档中的 example

    无法覆盖一个名为submit_line.html的模板

    我尝试将它放在/templates/admin//templates/admin/my_app//templates/admin/my_app/my_model/ 下。没有任何效果。

    我在django/contrib 下编辑了文件,它工作正常,但我不想更改那个文件。只是看看内容是否正在显示。

我只想在模板中添加一个按钮,以便用户可以下载一个 XML 文件。

【问题讨论】:

试试this。我认为这是你需要的;) 这考虑到我的需求在模板中,我可以隐藏元素。我需要添加一个按钮 您可以遵循此答案中的指南并覆盖'admin/submit_line.html' 模板。该模板内部是一排按钮。但是这个模板是通过这个包含标签呈现的。 对,但在我到达这一点之前,我的应用程序必须先获取我的 admin/submit_line.html 文件。它显然没有发现,也没有办法找出原因。 此模板将在创建此包含标签时找到。设置适当的路径,它应该可以工作。另一方面,如果这不起作用,还有另一种解决方案。使用jQuery“编辑”change_form.html并添加按钮。 【参考方案1】:

经过一些测试和研究,这里是解决方案。

首先,在/templates/admin/my_app/my_model/ 下,从django/contrib/admin/templates/admin/ 复制粘贴submit_line.html

更改submit_line.html 并添加您喜欢的任何网址。说:

<!-- submit_line.html -->

% load i18n admin_urls %
<div class="submit-row">
% if show_save %<input type="submit" value="% trans 'Save' %" class="default" name="_save" />% endif %
% if show_delete_link %
    % url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %
    <p class="deletelink-box"><a href="% add_preserved_filters delete_url %" class="deletelink">% trans "Delete" %</a></p>
% endif %

<!-- NEW SUBMIT INPUTS -->
<input type="submit" value="TEST" name="_saveasnewss" />
<input type="submit" value="TEST 2" name="_saveasnews" />
<!-- END NEW SUBMIT INPUTS -->

% if show_save_as_new %<input type="submit" value="% trans 'Save as new' %" name="_saveasnew" />% endif %
% if show_save_and_add_another %<input type="submit" value="% trans 'Save and add another' %" name="_addanother" />% endif %
% if show_save_and_continue %<input type="submit" value="% trans 'Save and continue editing' %" name="_continue" />% endif %
</div>

我们正在复制粘贴它,因为 change_form.html 中没有任何 % block % 标记可以覆盖。

进一步,在change_form.html 中,添加这些:

<!-- change_form.html -->

% extends "admin/change_form.html" %

% load my_app_tags % /* Change "my_app" to your app name that will contain the 'submit_row' template tag */

OTHER OVERRIDES HERE

% block submit_buttons_bottom %% submit_row %% endblock %

最后,在你应用的templatetags,添加这个模板标签:

# my_app/templatetags/my_app_tags.py

from django.contrib.admin.templatetags.admin_modify import submit_row
from django.template.loader import get_template
from django import template

# this would be the path to your "submit_line.html"
t = get_template('admin/my_app/my_model/submit_line.html')
register = template.Library()
register.inclusion_tag(t, takes_context=True)(submit_row)

就是这样!现在您应该只在my_model 添加/更改页面下看到这些额外的&lt;input type="submit" /&gt;。如果您希望它们在全球范围内使用,只需将 submit_line.html 从它所在的位置移动到 templates/admin/。不要忘记更新my_app/templatetags/my_app_tags.py 中的路径。

【讨论】:

嘿,我知道这不应该有感谢之类的东西,但是感谢您在编写所有代码的问题上的耐心和帮助。它在这里工作。我只需要进行一些调整(添加寄存器)即可使其正常工作。 :)

以上是关于在 django admin 中覆盖模板的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 django admin List_Filter 模板

在 Django 1.8 中覆盖现有的模板标记方法

在 Django Admin 中覆盖 change_form.html 模板时,其模型列表视图的面包屑显示为灰色且不可点击

html Django Admin:使用AJAX保存 - 覆盖`admin / change_form.html`模板

Django:覆盖每个应用程序而不是每个项目的“不可覆盖”管理模板?

无法覆盖 django-allauth 模板