Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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
django:在包含的模板中使用块_Django_Django Templates - Fatal编程技术网

django:在包含的模板中使用块

django:在包含的模板中使用块,django,django-templates,Django,Django Templates,我有一些html结构,可以在很多不同的地方重用。它不同于一个整体模板,所以我不能扩展它,它也可以用来包含复杂的内容,所以我不认为将它定义为模板标记可以很好地完成工作。下面是一些描述我期望结果的伪代码,当使用template_level2.html时,您可以通过调用其中的块,轻松地将内容放入可重用的_模式_模板中。如果我真的使用了这段代码,您在template_level_2.html的“实际内容”中编写的内容将不会显示出来。我该如何处理这件事 base.html <html> <

我有一些html结构,可以在很多不同的地方重用。它不同于一个整体模板,所以我不能扩展它,它也可以用来包含复杂的内容,所以我不认为将它定义为模板标记可以很好地完成工作。下面是一些描述我期望结果的伪代码,当使用template_level2.html时,您可以通过调用其中的块,轻松地将内容放入可重用的_模式_模板中。如果我真的使用了这段代码,您在template_level_2.html的“实际内容”中编写的内容将不会显示出来。我该如何处理这件事

base.html

<html>
<head></head>
<body>
{% block content %}{% endblock %}
</body>
</html>
可重用的\u模式\u模板.html

<div>
  <div>
    <div>
      {% block local_content %}{% endblock %}
    </div>
   </div>
</div>
更新: 很抱歉,模板_level2.html中的扩展有一些拼写错误,我刚刚更正了它

这可能不是很清楚,但上面的代码更像是描述我期望结果的伪代码。总之,

  • 我希望在我的文档中包含一些可重用的html模式 模板
  • 这些模式就像盒子一样,你可以把整个html放进去 满足于他们。因此,上下文变量对于 我的目的

Django不处理包含文件中的块

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


似乎最终的模板正在尝试扩展自身(如果它在引号中)

你真的不需要那么复杂。实际上要简单得多


基础模板应该包含模板的骨架,然后可以对其进行扩展以进行自定义。对于不希望包含在每个视图中的可重用代码块,
在适当的情况下包含它们,但不要在包含的文件中使用任何
扩展
包含
语句。Django不会解析这些内容,但是从视图传递的
上下文变量仍然可以使用。

您可以将可重用的\u模式\u模板拆分为开始和结束模板。然后在level1中,您可以选择包含开始、块、包含结束


或者,您可以将模板名称作为上下文变量传递到可重用的\u模式\u模板中,然后将其包含在可重用的\u模式\u模板中。在您的示例中,这需要更改级别1和级别2之间的关系,但通常会更强大。

我遇到了这个问题,并最终达成了以下折衷方案,希望其他人会觉得它有用。它依赖于对子模板中的
块使用

<!-- base.html: -->
<html>
  [...]
  <nav class="desktop">
    {% block desktop_nav %}
      {% include "includes/nav.html" %}
    {% endblock %}
  </nav>
  [...]
  <nav class="mobile">
    {% block mobile_nav %}
      {% include "includes/nav.html" %}
    {% endblock %}
  </nav>
  [...]
base.html希望重用通用的nav.html include,但定义了一些块,其中nav.html中的变量可能会被子模板覆盖

<!-- base.html: -->
<html>
  [...]
  <nav class="desktop">
    {% block desktop_nav %}
      {% include "includes/nav.html" %}
    {% endblock %}
  </nav>
  [...]
  <nav class="mobile">
    {% block mobile_nav %}
      {% include "includes/nav.html" %}
    {% endblock %}
  </nav>
  [...]
但子页面可以覆盖该值,如下所示:

<!--about.html:-->
{% extends "base.html" %}
{% block desktop_nav %}{% with selected='about' %}{{ block.super }}{% endwith %}{% endblock %}
{% block mobile_nav %}{% with selected='about' %}{{ block.super }}{% endwith %}{% endblock %}

{%extends“base.html”%}
{%block desktop_nav%}{%with selected='about%}{{{block.super}{%endwith%}{%endblock%}
{%block mobile_nav%}{%with selected='about%}{{{block.super}{%endwith%}{%endblock%}

因此,并非完美,我仍然需要有两个独立的块,并将这些
块与
块一起使用两次,但它确实允许我覆盖父模板中
包含
块中的变量。

简言之,您可以在计划包含的任何模板中创建变量,例如

{{ localcontent }}
然后在包含模板的任何位置分配这些变量,例如

{% include "name_snippet.html" with localcontent="Actual content" %}

似乎从未调用过
template\u level2.html
。如果您
包含
一些代码块,则不需要使用
block
语句,因为您将包含快速重新加载的时间和内容
template_level2.html
是模板的最终级别,因此它不包括/扩展到任何地方。通过调用
template\u level2.html
中的
{%block%}
语句,我打算将内容放入
可重用的\u pattern\u template.html
,这在
template\u level2.html
中使用?这是一个很棒的应用程序,它提供了一个很好的模式。template_level2.html不带引号被解释为必须计算为字符串或模板对象的变量。阅读更多关于视图中的变量仍然是共享和解析的。上下文也提供给了包含的模板(这可能与上面的注释相同,但“上下文”比视图中的变量更容易识别。)有帮助的解释,但是否有标记或其他方法来实现OP所希望的?一、 太,希望能够包括一个模板,仍然能够使用模板inheritance@ChrisPratt如果我想在脚本标记中包含一个具有一些“模型绑定”JS行为的页面,并且我不希望标记分散在所有地方(),该怎么办?我认为在这个场景中使用
include
非常适合所给出的定义。
{{ localcontent }}
{% include "name_snippet.html" with localcontent="Actual content" %}