测试模板中是否存在模板块

jjt*_*jjt 17 django django-templates

我有一个结构,(% block heading %}在我的基本模板中通常有一个页面标题:

base.html文件

<h2>{% block heading %}{% endblock %}</h2>
Run Code Online (Sandbox Code Playgroud)

大多数时候,我会通过扩展基础的模板传递这样的标题:

扩展-base.html文件

{% block heading %}Super Cool Page!{% endblock %}
Run Code Online (Sandbox Code Playgroud)

但是,对于特殊页面,我不希望有一个页面标题:

延伸碱基special.html

{% block heading %}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

理想情况下,这应该排除<h2>标签.现在,我可以让所有扩展模板都包含<h2>标签,但这违反了DRY,因为每个页面都应该具有页面级标题的相同元素.我更喜欢做的是(这似乎不起作用):

基prefered.html

{% if heading %}
<h2>{% block heading %}{% endblock %}</h2>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

这在模板级别上是否可行,或者我是否需要为此查看视图?

cza*_*aic 31

你可以双重包装它

{% block noheader %}
  <h2>{% block header %}Super Cool Page!{% endblock header %}</h2>
{% endblock noheader %}
Run Code Online (Sandbox Code Playgroud)

在没有标题的页面上

{% block noheader %}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的解决方案,但``{%block noheader%}``是一个糟糕的名称,使得解决方案看起来比实际上更黑.更好的命名是外部块的``{%block header%}``和内部块的``{%block header-text%}``.然后,名称更准确地反映您希望能够在后代模板中覆盖的部分. (8认同)
  • EW.+1因为它解决了问题 - 但要记住每个需要这个的模板都很难. (6认同)

gru*_*czy 6

像这样做:

  • base.html - 整体结构 <h2>{% block heading %}{% endblock %}</h2>
  • base-without-heading.html - 用这个扩展 base {% block heading %}{% endblock %}

然后扩展第一个或第二个模板。我相信这应该是最简单的方法。

顺便说一下。通过写作:

{% if heading %}
Run Code Online (Sandbox Code Playgroud)

您实际上是在名称为“标题”的上下文中要求元素的布尔值。django 标记语言的元素不在上下文中,所以你不能要求它们。你可以写一个标签,为上下文添加一些东西,我曾经需要这样的东西并使用它,但我不相信这是去这里的方式。以上解决方案应该有效(我没有机器来检查这个),这是 IMNSHO 的最佳方式。