我正在研究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块?
答案 0 :(得分:1)
虽然我认为这种模板标签不会被定制,但这是可能的。
最简单的方法可能是继承BlockNode
类来执行您想要的操作,并(稍微)复制do_block()
函数https://github.com/django/django/blob/master/django/template/loader_tags.py#L172以使用您的BlockNode
。
答案 1 :(得分:1)
可以编写块标记,但是您应该知道块标记和扩展标记一起工作。如果您查看BlockNode
和ExtendsNode
的代码,您将看到它们如何一起呈现模板内容。
ExtendNode从当前模板和父模板中捕获所有块节点。这些块存储在render_context中,密钥为BLOCK_CONTEXT_KEY,值为BlockContext的实例。使用方法add_blocks将所有块添加到BlockContext,该方法使用FIFO(先进先出)队列。一旦存储了所有块节点,ExtendNode就会呈现父模板。这会导致BlockNode实例在父模板中呈现。然后,BlockNode从render_context中选择BlockContext以获取块数据。并且由于FIFO,当BlockNode从BlockContext弹出块对象时,它选择最后一个块,即它在继承中遇到的块。这就是我在阅读代码时所理解的。如果我错过了什么,请纠正我。
您可以继承BlockNode以在一定程度上自定义它。