django:在包含的模板中使用块
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django:在包含的模板中使用块相关的知识,希望对你有一定的参考价值。
我有一些html结构,可以在很多不同的地方重用。它与整体模板不同,所以我不能扩展它,它也可以用来包含复杂的内容,所以我不认为将它定义为模板标签做得很好。下面是一些描述我想要的结果的伪代码,当使用template_level2.html时,您可以通过调用其中的块轻松地将内容放入reusable_pattern_template。如果我使用此代码,则您在template_level_2.html的“实际内容”中所写的内容将不会显示。我应该怎么处理这个?
base.html文件
<html>
<head></head>
<body>
{% block content %}{% endblock %}
</body>
</html>
template_level1.html
{% extends 'base.html' %}
{% block content %}
Something here...
{% include 'reusable_pattern_template.html' %}
Something else here...
{% endblock %}
reusable_pattern_template.html
<div>
<div>
<div>
{% block local_content %}{% endblock %}
</div>
</div>
</div>
template_level2.html
{% extends 'template_level1.html' %}
{% block local_content %}
Actual content here...
{% endblock %}
更新:对不起,template_level2.html中的扩展有一些拼写错误,我刚刚更正了。
它可能不是很清楚,但上面的代码更像是一个描述我想要的结果的伪代码。简而言之,
- 我想在我的模板中包含一些可重复使用的html模式。
- 这些模式就像盒子一样,你可以把整个html内容放在其中。因此,对于我的目的,上下文变量可能有点过于有限
Django不处理包含文件中的块。
include标记应该被视为“渲染此子模板并包含HTML”的实现,而不是“解析此子模板并将其内容包含在内,就好像它是父类的一部分”。这意味着包含的模板之间没有共享状态 - 每个包含都是完全独立的渲染过程。 (Django template tag documentation)
似乎最终模板试图扩展自己(如果它在引号中)。
你真的不需要那么多的复杂性。它实际上非常简单。
基本模板应该包含模板的骨架,然后您可以扩展它以进行自定义。对于您不希望包含在每个视图中的可重用代码块,请在适当的位置使用include
,但不要在包含的文件中使用任何block
,extends
或include
语句。 Django不会解析那些,但仍然可以使用从视图传递的context variable
。
我遇到了这个问题并最终得到了以下妥协,希望其他人可能会觉得它很有用。它依赖于在子模板中使用with
块。
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>
[...]
include模板依赖于一个名为selected
的变量,默认情况下base.html没有定义:
<!--includes/nav.html:-->
<a href="/about/" class="{% if selected == 'about' %}selected{% endif %}">About</a>
<a href="/people/" class="{% if selected == 'people' %}selected{% endif %}">People</a>
<a href="/contact/" class="{% if selected == 'contact' %}selected{% endif %}">Contact</a>
但子页面可以覆盖该值,如下所示:
<!--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 %}
所以,不完美,我仍然必须有两个单独的块,并使用这些with
块两次,但它确实允许我覆盖父模板中的include
块中的变量。
您可以将reusable_pattern_template拆分为开始和结束模板。然后在level1你可以去包括begin,block,include end。
或者,您可以将模板名称作为上下文变量传递给reusable_pattern_template,然后将其包含在reusable_pattern_template中。这将需要更改示例中level1和level2之间的关系,但通常更强大。
以上是关于django:在包含的模板中使用块的主要内容,如果未能解决你的问题,请参考以下文章
使用 django-pygmentify 突出显示 Django 模板引擎中的内部代码块
是否可以使用 django 的自定义模板标签在模板的其他块中插入代码?