Django自定义模板标签模仿{%block%}行为

时间:2013-06-20 08:19:31

标签: django django-templates

我正在研究Django custom template tags,并对自定义标签的可能性提出了疑问。

假设我有像

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

我希望像

一样缩短它
{% extends "base.html" %}
{% load myawesometags %}
{% myblock leftmenu %}
    ...
{% endmyblock %}

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

2 个答案:

答案 0 :(得分:1)

虽然我认为这种模板标签不会被定制,但这是可能的。

最简单的方法可能是继承BlockNode类来执行您想要的操作,并(稍微)复制do_block()函数https://github.com/django/django/blob/master/django/template/loader_tags.py#L172以使用您的BlockNode

答案 1 :(得分:1)

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

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

您可以继承BlockNode以在一定程度上自定义它。