Django标记返回块标记中的数组

时间:2012-11-20 23:47:38

标签: django django-templates

我想在HTML表格中显示一系列字符串项,模板中最简单的方法就是“消息”表单。我称之为“活动”:

{% if activities %}
  <table class="activities">
    <tr>
     {% for activity in activities %}
       <td>{{ activity }}</td>
     {% endfor %}
    </tr>
  </table>
{% endif %}

我认为活动可以是一个返回数组的简单标记,但我从其他stackoverflow答案(下面链接)中看到,这是为了将返回的字符串放入模板中,而不是返回值。

我不需要这个数组的上下文或任何参数,但它可能在不同的页面上以不同的格式出现,所以我不希望标签返回表格的“innerHTML”。

我该怎么做?我在一个额外的文件中尝试了以下内容(并验证它是被调用的,我故意将语法错误放入其中,当我进入此页面时它确实已经触发了,所以我删除了它们):

from django import template

register = template.Library()

@register.simple_tag
def activities():
  return ("A", "B")
activities = register.simple_tag(activities)

我也尝试过装饰器,只需调用'register'(无论是否设置返回值),都没有效果。桌子总是空的。

有关stackoverflow的很多相关问题,但每个问题似乎都是根据略有不同的情况量身定制的,使用inclus_tag的closest似乎对这个简单的案例进行了过度设计。

1 个答案:

答案 0 :(得分:2)

如果您使用的是Django&gt; = 1.4,则有一种简单的方法可以创建assignment tags。它们将返回值存储在as关键字后指定的模板变量中。在你的情况下,那将是:

{% get_activities as activities %}
{% if activities %}
  <table class="activities">
    <tr>
     {% for activity in activities %}
       <td>{{ activity }}</td>
     {% endfor %}
    </tr>
  </table>
{% endif %}

此标记背后的代码非常简单。真正重要的是assignment_tag装饰者。

from django import template

register = template.Library()

@register.assignment_tag
def get_activities():
    return ("A", "B")

对于早于1.4的Django版本,这仍然可行,但需要更多的样板代码来创建编译功能和节点类。实际上Django文档describes this approach就在assignment_tag之前。