在扩展管理员应用的change_form模板时出现无限递归

13 投票
6 回答
3214 浏览
提问于 2025-04-16 11:38

我在 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 个回答

3

另外,你可以通过 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" %}
4

你现在在 admin/change_form.html 这个文件里,并且你想要扩展(也就是在这个基础上进行修改) admin/change_form.html。但是,你不能在自己正在使用的模板里再扩展它。

你可能以为,如果你覆盖了管理员应用的模板,就可以在这个被覆盖的模板上进行扩展。但实际上并不是这样的。当你覆盖一个模板时,你就无法再访问它了。

解决这个问题的方法是,先复制原来的模板,然后对你不喜欢的地方进行修改。

14

我知道现在说这个有点晚,但...

如果要扩展功能——这比重复代码要好得多——关键是要把文件命名为除了 /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 安装的完整路径,而不是相对路径。

撰写回答