我是Django的新手,但我真的非常喜欢它。但偶尔我似乎遇到了一些我似乎没有把事情弄清楚的地方。所以,我要求一些帮助和指导。
我正在尝试为我的某个模型扩展对象工具,以便我可以在历史记录旁边有一个“打印”按钮。
我的模板如下:
project/app/templates/admin/
我成功扩展base_site.html而没有任何问题。
project/app/templates/admin/base_site.html
然而,当我像这样添加change_form.html时:
project/app/templates/admin/change_form.html
以下内容:
{% extends 'admin/change_form.html' %}
{% block object-tools %}
<a href="one">One</a>
<a href="one">Two</a>
{% endblock %}
我得到一个例外:调用Python对象时超出了最大递归深度
这似乎让我遗漏了一些非常基本的东西。
我尝试过的事情:
我很困惑,也没有成功。
P.S。:我也在这里使用引导主题http://riccardo.forina.me/bootstrap-your-django-admin-in-3-minutes/但是出于这个问题的目的,我目前还没有使用它。
答案 0 :(得分:5)
问题是admin/change_form.html
块中的{% extend %}
被解析为project/app/templates/admin/change_form.html
。
一种解决方案是创建一个以您的应用命名的templates
子目录 - 可能是project/templates/admin/app/change_form.html
。
要覆盖其中一个或多个,首先在项目的templates目录中创建一个admin目录。这可以是您在TEMPLATE_DIRS中指定的任何目录。
在此管理目录中,创建以您的应用命名的子目录。
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing-an-admin-template
答案 1 :(得分:2)
那是因为你正在自己扩展模板。我所做的是将我的自定义管理模板放在templates/admin
中。然后在同一文件夹中我将符号链接到django管理文件夹(templates/admin/admin
)。
所以我的扩展看起来像:
{% extends 'admin/admin/change_form.html' %}
如果您想沿着这条路走下去,请务必覆盖index.html
。
答案 2 :(得分:0)
我找到的最好的方法是使用'..'
上几个目录,然后返回到只能在Django代码库中找到的目录。
由于Django模板类似于"django/contrib/admin/templates/admin"
,我发现这对我有用:
{% extends "../../admin/templates/admin/change_form.html" %}
如果仍然会导致与其他结构发生冲突,您可以更进一步:
{% extends "../../../contrib/admin/templates/admin/change_form.html" %}
甚至:
{% extends "../../../../django/contrib/admin/templates/admin/change_form.html" %}
虽然它有点hacky,但至少通过执行上述操作,您不必使用其他涉及复制django源或设置符号链接的技术。