【问题标题】:Django tag to return an array in block tagDjango标签在块标签中返回一个数组
【发布时间】:2012-11-09 04:03:27
【问题描述】:

我有一个字符串项数组,我想在 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)

我也试过只使用装饰器,只调用“注册”(有和没有返回值的设置),但没有一个工作。桌子总是空的。

关于 stackoverflow 有很多相关问题,但每个问题似乎都是针对略有不同的情况量身定制的,而使用包含标签的 closest 对于这个简单的情况似乎有些过度设计。

【问题讨论】:

  • 请注意,您只需要注册您的标签一次。在您的示例中,您正在使用装饰器,然后在下面第二次注册标签。

标签: django django-templates


【解决方案1】:

如果您使用的是 Django >= 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 之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 2018-04-13
    • 2015-06-26
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2016-10-22
    • 2011-02-09
    相关资源
    最近更新 更多