在扩展管理员应用的change_form模板时出现无限递归
我在 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
6 个回答
另外,你可以通过 change_form_template
这个属性,把你的 AdminOptions
类指向另一个模板。
就像这样:
class MyOptions(AdminOptions):
change_form_template = 'myapp/my_change_form.html'
还有 myapp/my_change_form.html
:
{% extends "admin/change_form.html" %}
你现在在 admin/change_form.html
这个文件里,并且你想要扩展(也就是在这个基础上进行修改) admin/change_form.html
。但是,你不能在自己正在使用的模板里再扩展它。
你可能以为,如果你覆盖了管理员应用的模板,就可以在这个被覆盖的模板上进行扩展。但实际上并不是这样的。当你覆盖一个模板时,你就无法再访问它了。
解决这个问题的方法是,先复制原来的模板,然后对你不喜欢的地方进行修改。
我知道现在说这个有点晚,但...
如果要扩展功能——这比重复代码要好得多——关键是要把文件命名为除了 /admin/change_form.html
以外的任何名字。
(虽然提问者提到的是 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 安装的完整路径,而不是相对路径。