django模板标签,使用数组输出

时间:2014-07-17 03:23:46

标签: arrays django tags django-templates

我创建了一个输出为数组的标记:

from django import template
register = template.Library()

def create_array(context):
    output=[1,2,3,4]
return output

register.simple_tag(takes_context=True)(create_array)

当我在模板中调用此标记:{% load create_array %} {% create_array %}时,会打印数组,但我无法以这种方式访问​​每个元素:

{% load create_array %}
{% for i in create_array %} {{i}} {% forend %}

知道如何访问每个元素?

错误发生在模板渲染过程中:异常值:'create_array'对象不可迭代。

PS:我在标签中需要“上下文”,所以我只写了一个简短的例子。我正在使用Django版本1.6.2

3 个答案:

答案 0 :(得分:1)

@laffuste有一个很好的观点,你需要使用as命令将数组存储到模板变量中,然后再遍历它。但是,有一种更简洁的方式来编写标签 - 实际上,这正是Assignment Tags所做的:

from django import template
register = template.Library()

@register.assignment_tag(takes_context=True)
def create_array(context):
    return [1,2,3,4]

就是这样 - 赋值标签执行令人讨厌的解析工作并返回模板变量友好的输出。 laffuste对模板的回答正是你所需要的,但这样你就可以把它放在一个地方,这里再次复制,所以它都集中在一个地方:

{{ load my_custom_tags }}

{% create_array as my_array %}

{% for item in my_array %}
     {{ item }}
{% endfor %}

答案 1 :(得分:0)

要获取forloop中每个对象的索引,请使用forloop.counter,如下所示:

{% load create_array %}
{% for i in create_array %} 
     {{ forloop.counter }}
{% forend %}

如果你想在forloop中点击某个计数时做某事,那么使用以下代码:

{% for i in create_array %}
    {% if forloop.counter == 1 %}
       Do something with {{ i }}.
    {% endif %}
{% endfor %}

以下是forloop计数器的Django文档:

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for

答案 2 :(得分:0)

我担心没有比......更简单的方法了。

from django import template
from django.template.base import TemplateSyntaxError

register = template.Library()

@register.tag(name='create_array')
def create_array(parser, token):

    class ArrayCreator(template.Node):
        def __init__(self, var_name):
            self.var_name = var_name # output variable

        def render(self, context):
            context[self.var_name] = [1, 2, 3, 4] # access to context
            return ''

    args = token.contents.split() # "create_array", "as", VAR_NAME

    if len(args) != 3 or args[1] != 'as':
        raise TemplateSyntaxError("'create_array' requires 'as variable' (got %r)" % args)

    return ArrayCreator(args[2])

模板中的用法:

{{ load my_custom_tags }}

{% create_array as my_array %}

{% for item in my_array %}
    {{ item }}
{% endfor %}

但也许有人会带来更轻更好的东西?