我在template/admin/change_form.html
中有以下模板:
{% extends "admin/change_form.html" %}
{% block extrahead %}
{% include "dojango/base.html" %}
{% block dojango_content %}
{% endblock %}
{% endblock %}
但由于某种原因,它会抛出一个
TemplatesyntaxError: TemplateSyntaxError at /admin/cms/post/add/
Caught RuntimeError while rendering: maximum recursion depth exceeded while calling a Python object
答案 0 :(得分:13)
我知道现在已经很晚了,但是......
如果延伸 - 这是一个比复制更好的选择 - 关键是让它命名为 除了 /admin/change_form.html
。
(尽管OP引用template/admin/change_form.html
,这只是因为他的TEMPLATE_DIRS元组中的路径以'/ template'结尾 - 我的一般以'/ templates'结尾 - 但是,这些目录可以命名为任何内容位于任何地方。)
如果命名为/admin/<MyAppName>/change_form.html
如果命名为/admin/<MyAppName>/<MyModelName>/change_form.html
如果在ModelAdmin
中明确指定,则可以将其命名为任何名称class MyModelAdmin(admin.ModelAdmin):
change_form_template = 'subdir/my_change_form.html'
最后,如果坚持命名/admin/change_form.html
,您可以 - 只要extends
标记包含django安装的完整路径而不是相对的安装路径。
答案 1 :(得分:4)
您在admin/change_form.html
,并且您延长了admin/change_form.html
。您无法扩展您所在的模板。
您可能希望如果从管理应用程序覆盖模板,则可以扩展您覆盖的模板。但这不是它的工作原理。当您覆盖模板时,您无法访问它。
解决您的问题的方法是复制原始模板并更改您不喜欢的内容。
答案 2 :(得分:2)
此外,您可以使用AdminOptions
属性将change_form_template
课程指向另一个模板。
类似的东西:
class MyOptions(AdminOptions):
change_form_template = 'myapp/my_change_form.html'
myapp/my_change_form.html
:
{% extends "admin/change_form.html" %}
答案 3 :(得分:2)
我遇到了同样的问题。通过将重写的模板放在myapp / templates / admin / myapp下而不是myapp / templates / admin来解决。
答案 4 :(得分:1)
我找到的最好的方法是使用'..'
上几个目录,然后返回到只能在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源或设置符号链接的技术。
答案 5 :(得分:0)
使用Django核心是不可能的。但这并非不可能。
复制并粘贴“原始模板并更改您不喜欢的内容”,这非常难看。
不要在模板中制作,不管你在python中做什么
此解决方案适用于任何模板: