【问题标题】:Accessing parallel arrays in Django templates?访问 Django 模板中的并行数组?
【发布时间】:2011-01-05 05:44:51
【问题描述】:

我的视图代码基本上是这样的:

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]。这可能吗?

【问题讨论】:

  • 我总是可以为这个用例编写一个自定义模板标签,但这似乎有点矫枉过正。我不想说{{ other_values|access:index }}。

标签: python django django-templates


【解决方案1】:

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 %}

【讨论】:

  • 我会改用itertools.izip
  • 我宁愿不必在上下文中添加更多内容,这会使上下文数据变得非常多余。此外,如果我更改了我的模板(例如,不再访问这些并行数组),那么我必须记得清理视图代码。感觉它跨越了数据和演示之间的界限。
  • @slacy:您的问题不仅仅是关于演示文稿。项目之间的关联在两个“平行”数组中是必不可少的。 “并行”数组实际上只是等待创建的 2 元组。您应该将它们放在视图函数中,因为它们在逻辑上绝对属于一起。这就是你将它们放在一起展示的原因。
  • @PiotrLegnica:绝对。固定的。同样使用 izip 它不会在内存中创建一个巨大的新结构。
猜你喜欢
  • 2011-01-30
  • 2017-11-24
  • 2011-07-10
  • 2015-09-26
  • 2017-04-12
  • 1970-01-01
  • 2017-03-19
  • 2015-03-17
  • 2020-11-04
相关资源
最近更新 更多