扩展管理员的app change_form模板时无限递归

时间:2011-02-11 12:21:13

标签: python django django-admin django-templates

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

答案 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中做什么

此解决方案适用于任何模板:

http://pypi.python.org/pypi/django-smart-extends