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请求:这是一个更好的答案。非常感谢你。