django模板:包含和扩展

Net*_*zen 101 python django django-templates

我想在2个不同的基本文件中提供相同的内容.

所以我试着这样做:

page1.html:

{% extends "base1.html" %}
{% include "commondata.html" %}
Run Code Online (Sandbox Code Playgroud)

page2.html:

{% extends "base2.html" %} 
{% include "commondata.html" %}
Run Code Online (Sandbox Code Playgroud)

问题是我似乎无法同时使用extends和include.有办法做到这一点吗?如果没有,我怎样才能实现上述目标?

commondata.html覆盖base1.html和base2.html中指定的块

这样做的目的是以pdf和html格式提供相同的页面,其格式略有不同.上面的问题虽然简化了我想要做的事情,但如果我能得到答案,它将解决我的问题.

Mat*_*ell 103

当您使用extends template标签时,您说当前模板扩展另一个 - 它是一个子模板,依赖于父模板.Django将查看您的子模板并使用其内容填充父级.

您想要在子模板中使用的所有内容都应该在块中,Django用它来填充父级.如果你想在那个子模板中使用include语句,你必须把它放在一个块中,让Django理解它.否则它只是没有意义,Django不知道如何处理它.

Django文档有一些非常好的例子,可以使用块来替换父模板中的块.

https://docs.djangoproject.com/en/dev/ref/templates/language/#template-inheritance


pod*_*mok 75

来自Django文档:

include标记应该被视为"渲染此子模板并包含HTML"的实现,而不是"解析此子模板并将其内容包含在内,就好像它是父类的一部分".这意味着包含的模板之间没有共享状态 - 每个包含都是完全独立的渲染过程.

因此Django不会从你的commondata.html中获取任何块,并且它不知道如何处理渲染的html外部块.


小智 21

这应该可以解决这个问题:在块部分中放入include标签.

page1.html:

{% extends "base1.html" %}

{% block foo %}
   {% include "commondata.html" %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

page2.html:

{% extends "base2.html" %}

{% block bar %}
   {% include "commondata.html" %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

  • 完美的。为我工作。 (2认同)

Net*_*zen 12

有关它为什么不适合我的更多信息,以防万一它可以帮助未来的人:

它不起作用的原因是django中的{%include%}不喜欢花式撇号这样的特殊字符.我试图包含的模板数据是从word中粘贴的.我不得不手动删除所有这些特殊字符,然后成功包含它.