1

我正在研究Django 自定义模板标签,并收到一个关于自定义标签可能性的问题。

假设我有一个像

{% extends "base.html" %}
{% block leftmenu %}
    {% spaceless %}
        <div id="#leftmenu">
            ...
        </div>
    {% endspaceless %}
{% endblock %}

我想缩短它

{% extends "base.html" %}
{% load myawesometags %}
{% myblock leftmenu %}
    ...
{% endmyblock %}

我不能只创建自定义标签添加<div>和删除空格,因为没有{% block ... %}内容不会将其放置在基本模板中。所以,问题是:是否可以在自定义模板标签中模拟标准 Django 块?

4

2 回答 2

2

可以编写块标签,但是您应该知道块标签和扩展标签一起工作。如果您查看代码BlockNodeExtendsNode您将看到它们如何一起呈现模板内容。

ExtendNode 从当前模板和父模板中捕获所有块节点。这些块存储在 render_context 中,键为 BLOCK_CONTEXT_KEY,值作为 BlockContext 的实例。使用使用 FIFO(先进先出)队列的方法 add_blocks 将所有块添加到 BlockContext。一旦存储了所有块节点,ExtendNode 就会呈现父模板。这会导致 BlockNode 实例在父模板中呈现。BlockNode 然后从 render_context 中选择 BlockContext 来获取块数据。并且由于 FIFO,当 BlockNode 从 BlockContext 弹出块对象时,它会选择最后一个块,即它在继承中最后遇到的块。这就是我在阅读代码时所理解的。如果我错过了什么,请纠正我。

您也许可以继承 BlockNode 以对其进行一定程度的自定义。

于 2013-06-20T10:22:03.473 回答
1

这是可能的,尽管我认为这种模板标签不应该被定制。

最简单的方法可能是继承BlockNode类来做你想做的事并(有点)复制do_block()函数https://github.com/django/django/blob/master/django/template/loader_tags.py#L172来使用你的BlockNode.

于 2013-06-20T10:05:21.717 回答