【问题标题】:Django custom template tags imitating {% block %} behavior模仿 {% block %} 行为的 Django 自定义模板标签
【发布时间】:2013-06-20 08:19:31
【问题描述】:

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

假设我有这样的结构

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

我想缩短它像

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

我不能只创建自定义标签添加&lt;div&gt; 并删除空格,因为没有{% block ... %} 内容将不会在基本模板中占据位置。那么,问题来了:是否可以在自定义模板标签中模拟标准 Django 块?

【问题讨论】:

  • 有可能,虽然我认为这种模板标签不应该被定制。最简单的方法可能是(某种程度上)复制do_block 函数github.com/django/django/blob/master/django/template/… 以使用您的BlockNode 并继承BlockNode 类来做您想做的事情。
  • 看来你是对的!我会接受这个作为答案。 :)

标签: django django-templates


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    有可能,虽然我认为这种模板标签不应该被定制。

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

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 2015-01-20
      • 2012-03-15
      • 2015-03-03
      • 2011-03-31
      • 2011-10-05
      • 1970-01-01
      • 2015-12-17
      相关资源
      最近更新 更多