2012-11-20 28 views
1

我有一个字符串项目的数组我想要在HTML表中显示,它看起来像模板中最简单的方法是'消息'的形式。我称他们为“活动”:Django标签返回块标签中的数组

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

我想活动可能是一个简单的标记,它返回一个数组,但我从其他计算器答案(下面的链接)看到,这是返回一个字符串被放在模板,不是为了返回值。

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

我该怎么做?我试图在额外文件中的以下(并验证它被称为我故意把语法错误了进去,果然他们触发,当我去到这个页面,所以我删除它们):

from django import template 

register = template.Library() 

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

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

在stackoverflow上有很多相关的问题,但每一个似乎都是为一个稍微不同的情况而量身定制的,使用inclusion_tag的closest看起来对于这个简单的例子来说过于设计了。

+1

请注意,您只需注册一次标签。在你的例子中,你使用装饰器,然后在下面第二次注册标签。 – Alasdair

回答

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") 

随着Django 1.4以前的版本,这仍然是可行的,但需要更多的样板代码来创建编译函数和节点类。事实上Django文档describes this approach之前的assignment_tag