Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django模板:包含和扩展_Python_Django_Django Templates - Fatal编程技术网

Python django模板:包含和扩展

Python django模板:包含和扩展,python,django,django-templates,Python,Django,Django Templates,我想在两个不同的基本文件中提供相同的内容 所以我试着这么做: page1.html: {% extends "base1.html" %} {% include "commondata.html" %} {% extends "base1.html" %} {% block foo %} {% include "commondata.html" %} {% endblock %} 第2.html页: {% extends "base2.html" %} {% include "co

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

所以我试着这么做:

page1.html:

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

{% block foo %}
   {% include "commondata.html" %}
{% endblock %}
第2.html页:

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

{% block bar %}
   {% include "commondata.html" %}
{% endblock %}
问题是我似乎不能同时使用extends和include。有什么办法吗?如果没有,我该如何完成上述工作

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


这样做的目的是以pdf和html格式提供相同的页面,格式略有不同。不过,上面的问题简化了我试图做的事情,如果我能得到答案,它将解决我的问题。

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

要在子模板中使用的所有内容都应该在块中,Django使用块填充父模板。如果您想在子模板中使用include语句,您必须将它放在一个块中,以便Django理解它。否则它就毫无意义,Django也不知道该怎么处理它

Django文档中有几个使用块替换父模板中的块的非常好的示例


更多关于为什么它对我不起作用的信息,以防它对未来的人有帮助:

它不起作用的原因是,django中的{%include%}不喜欢特殊字符,比如奇特的撇号。我试图包含的模板数据是从word粘贴的。我不得不手动删除所有这些特殊字符,然后成功地将其包括在内。

来自Django文档:

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


因此,Django不会从commondata.html中获取任何块,它也不知道如何处理块外呈现的html。

添加此项以供将来通过google找到此项的人参考:对于此类情况,您可能需要查看夹层库提供的{%overextend%}标记

不能将包含文件中的块拉入子模板以覆盖父模板的块。但是,可以在变量中指定父级,并在上下文中指定基础模板

从:

{%extends variable%}使用变量的值。如果变量的计算结果为字符串,Django将使用该字符串作为父模板的名称。如果变量的计算结果为模板对象,Django将使用该对象作为父模板


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

编辑2015年12月10日:正如评论中指出的,ssi自1.8版起就被弃用。根据文件:

此标记已被弃用,将在Django 1.10中删除。改为使用include标记


在我看来,这个问题的正确(最佳)答案来自于podshumok,因为它解释了include行为与继承一起使用的原因

然而,我有点惊讶,没有人提到Django模板系统提供的ssi标记,它是专门为内联(包括外部文本)而设计的。在这里,内联意味着外部文本不会被解释、解析或插入,而只是在调用模板内“复制”

请参阅文档以了解更多详细信息(请确保在页面右下角的选择器中检查您的Django适当版本)

从文件中:


还要注意此技术的安全性影响,以及必须添加到设置文件中的所需允许的包含根定义。

这应该能帮到您:将包含标记放在块节内

page1.html:

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

{% block foo %}
   {% include "commondata.html" %}
{% endblock %}
第2.html页:

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

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

my commondata.html中定义了块。但它并没有取代父tempalte的块。。。如果我没有执行include,而是在page1.html和page2.html中编写了两次精确的数据,那么它当然可以工作。但是我想把这个共性因素考虑到commondata.html中。似乎是可行的,我记得我尝试过这个,但我当时肯定是打字错误或其他原因导致它不起作用。请参阅下面我的答案,了解为什么它第一次对我不起作用,我会给你一个公认的答案,因为你正确地回答了我提出的问题。注意,截至1.8,ssi已被弃用,取而代之的是Include。完美的对我有用。