2010-01-14 37 views
5

我的视图代码基本上是这样的:在Django模板中访问并行数组?

context = Context() 
context['some_values'] = ['a', 'b', 'c', 'd', 'e', 'f'] 
context['other_values'] = [4, 8, 15, 16, 23, 42] 

我想我的模板代码看起来像这样:

{% for some in some_values %} 
    {% with index as forloop.counter0 %} 
    {{ some }} : {{ other_values.index }} <br/> 
    {% endwith %} 
{% endfor %} 

而且我希望它可以输出:

a : 4 <br/> 
b : 8 <br/> 
c : 15 <br/> 
d : 16 <br/> 
e : 23 <br/> 
f : 42 <br/> 

这可能吗?我发现我的“with”语句实际上正在工作,但是然后使用该变量作为参考不起作用。我怀疑对于{{other_values.index}}它正在执行other_values ['index']而不是other_values [index]。这可能吗?

+0

我总是可以写这个用例的自定义模板标签,但它似乎是大材小用。我讨厌不得不说{{other_values | access:index}}。 – slacy 2010-01-14 19:54:07

回答

8

zip(some_values, other_values),然后用它在模板

from itertools import izip 
some_values = ['a', 'b', 'c', 'd', 'e', 'f'] 
other_values = [4, 8, 15, 16, 23, 42] 
context['zipped_values'] = izip(some_values, other_values) 

{% for some, other in zipped_values %} 
    {{ some }}: {{ other }} <br/> 
{% endfor %} 
+1

我会使用'itertools.izip'来代替。 – 2010-01-14 19:49:45

+0

我宁愿不必添加更多的上下文,这使得上下文数据相当多余。此外,如果我改变我的模板(比如说,不再访问这些并行数组),那么我必须记得清理视图代码。它感觉它跨越了数据和表现之间的界限。 – slacy 2010-01-14 19:53:02

+1

@slacy:你的问题不纯粹是关于表达。项目之间的关联在两个“并行”数组中很重要。 “并行”数组实际上只是等待创建的2元组。你*应该*将它们放在视图函数中,因为它们完全属于逻辑。这就是为什么你要把它们放在一起。 – 2010-01-14 19:56:24