32

我一直试图在 django 模板中的 if 条件内调用一个块。

我有一个base template. 我有许多其他扩展基本模板的模板。我在基本模板中定义了一个块:

{% block test_block %}Test{% endblock %}

然后我想在其他模板中的某个条件下覆盖这个块。如果条件失败,则不应覆盖该块。这是我写的东西:

{% if test_value %}{% block test_block %}Development{% endblock %}{% endif %}

这实际上(或可能实际上)忽略了 if 条件。

我最终做了什么:

{% block test_block %}{% if test_value %}Development{% else %}{{ block.super }}{% endif %}{% endblock %}

我不得不在任何需要的地方做这样的事情。

这是最好的方法吗?这是唯一的方法吗?为什么我不能尝试我的第一种方法?还是我这边有什么错误?

4

1 回答 1

21

您没有犯错 - 模板块被包括在内,无论它们周围有任何条件。您可以从Django 源代码中的ExtendsNode类的这一行中看到这一点:django/template/loader_tags.py

self.blocks = {n.name: n for n in nodelist.get_nodes_by_type(BlockNode)]}

当s{% extends %}被渲染时,它直接从模板中获取所有块节点,并在父节点遇到这些blocks 时将它们存储起来以进行渲染。不考虑孩子中的这些块是否在条件内。

于 2014-03-22T23:16:53.507 回答