Django的模板:包括和扩展

我想在两个不同的基础文件中提供相同的内容。

所以我试图这样做:

page1.html:

{% extends "base1.html" %} {% include "commondata.html" %} 

page2.html:

 {% extends "base2.html" %} {% include "commondata.html" %} 

问题是,我似乎无法使用扩展和包括。 有没有办法做到这一点? 如果不是,我怎么能做到以上?

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

这样做的目的是提供pdf和html格式的相同页面,格式稍有不同。 上面的问题虽然简化了我想要做的,如果我能得到一个答案,它将解决我的问题。

当您使用扩展模板标记时,您说当前模板扩展了另一个 – 它是一个子模板,依赖于父模板。 Django将查看您的子模板并使用其内容来填充父级。

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

Django文档有几个非常好的使用块代替父模板中的块的例子。

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

从Django文档:

include标签应该被认为是“渲染这个子模板并包含HTML”的实现,而不是“parsing这个子模板并且包含它的内容,就像它是父代的一部分一样”。 这意味着在包含的模板之间不存在共享状态 – 每个包含都是完全独立的呈现过程。

所以Django不会从你的commondata.html中获取任何块,它不知道如何处理块外的HTML。

更多的信息,为什么它不能为我工作,以帮助未来的人:

之所以不工作,是因为django中的{%include%}不喜欢特殊的字符,比如花哨的撇号。 我试图包含的模板数据是从单词中粘贴的。 我不得不手动删除所有这些特殊字符,然后成功包括它。

您无法从包含的文件中将块拖入子模板以覆盖父模板的块。 但是,您可以在variables中指定父项,并在上下文中指定基本模板。

从文档 :

{%extends variable%}使用variables的值。 如果variables的计算结果为string,Django将使用该string作为父模板的名称。 如果variables的计算结果为一个Template对象,Django将使用该对象作为父模板。

而不是单独的“page1.html”和“page2.html”,把{% extends base_template %}放在“commondata.html”的顶部。 然后在你看来,将base_template定义为“base1.html”或“base2.html”。

这应该为你做的伎俩:把包含标记内的块部分。

page1.html:

 {% extends "base1.html" %} {% block foo %} {% include "commondata.html" %} {% endblock %} 

page2.html:

 {% extends "base2.html" %} {% block bar %} {% include "commondata.html" %} {% endblock %} 

添加以供将来通过谷歌search的人参考:您可能需要查看夹层库为此类情况提供的{%overextend%}标记。

编辑2015年12月10日 :正如在评论中指出的那样, ssi从版本1.8开始已被弃用。 根据文件:

这个标签已被弃用,并将在Django 1.10中被删除。 改用include标签。


在我看来,对这个问题的正确(最好)答案是podshumok的答案 ,因为它解释了为什么包含在与inheritance一起使用时的行为。

然而,我有些惊讶,没有人提到Django模板系统提供的ssi标签,它是专门为包含外部文本的 内联而devise的。 在这里, 内联意味着外部文本不会被解释,parsing或内插,而只是在调用模板中“复制”。

请参阅文档以获取更多详细信息(请务必在页面右下angular的select器中检查相应的Django版本)。

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi

从文档:

 ssi Outputs the contents of a given file into the page. Like a simple include tag, {% ssi %} includes the contents of another file – which must be specified using an absolute path – in the current page 

也要注意这种技术的安全含义以及所需的ALLOWED_INCLUDE_ROOTS定义,这些定义必须添加到您的设置文件中。