我创建了一个输出为数组的标记:
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
答案 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 %}
但也许有人会带来更轻更好的东西?