Python 扩展管理';s应用程序更改表单模板

Python 扩展管理';s应用程序更改表单模板,python,django,django-admin,django-templates,Python,Django,Django Admin,Django Templates,我在template/admin/change\u form.html中有以下模板: {% extends "admin/change_form.html" %} {% block extrahead %} {% include "dojango/base.html" %} {% block dojango_content %} {% endblock %} {% endblock %} 然而,由于某种原因,它抛出了一个错误 TemplatesyntaxError: Templat

我在
template/admin/change\u 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

您在
admin/change\u form.html
中,您扩展了
admin/change\u form.html
。您不能扩展所处的同一模板

您可能期望,如果您从管理应用程序重写模板,您可以扩展您重写的模板。但事实并非如此。重写模板时,无法访问该模板


您的问题的解决方案是复制原始模板并更改您不喜欢的内容。

此外,您可以使用
change\u form\u template
属性将您的
AdminOptions
类指向另一个模板

比如:

class MyOptions(AdminOptions):
    change_form_template = 'myapp/my_change_form.html'
myapp/my\u change\u form.html

{% extends "admin/change_form.html" %}

我也有同样的问题。解决方法是将覆盖的模板放在myapp/templates/admin/myapp下,而不是放在myapp/templates/admin下。

对于Django core,这是不可能的。但这并非不可能

复制并粘贴“原始模板并更改您不喜欢的内容”,这非常难看

不要在模板中生成,无论您在python中没有生成什么

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


我知道已经很晚了,但是

如果扩展—这是一个比复制好得多的选项—关键是将它命名为除
/admin/change\u form.html
之外的任何东西

(虽然OP引用了
template/admin/change\u form.html
,但这仅仅是因为他的template\u DIRS元组中的路径以“/template”-结尾,通常以“/templates”-结尾,但这些目录可以命名为任何名称,也可以位于任何位置。)

如果命名为
/admin//change\u form.html

如果命名为
/admin///change\u form.html

如果在ModelAdmin中显式指定,则可以将其命名为任何名称

class MyModelAdmin(admin.ModelAdmin):
    change_form_template = 'subdir/my_change_form.html'

最后,如果坚持将其命名为
/admin/change\u form.html
,您可以-前提是
extends
标记包含django安装的完整路径,而不是相对路径。

我发现最好的方法是使用
“…”
进入几个目录,然后返回到只应在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" %}

虽然这有点黑客,但至少通过执行上述操作,您不必使用涉及复制django源代码或设置符号链接的其他技术

我确信你可以在那个级别扩展变更表单?它不必是每个应用程序/模型的,例如模板/管理员/cms/发布/更改表单。html@Jameso:文档中另有说明尽管公认的答案有效,但在我看来有点过于严厉。这是一个更好的答案,因为正如文档所说,“通常没有必要也不建议替换整个模板”。当使用DEBUG=True时,您必须修补Django。这也不太好。我必须在DEBUG=False时修补Django。如果您不想使用smart extends,并且您想要一个补丁,您可以看到这个pull请求:这是一个更好的答案。非常感谢你。