如何在 Django 模板中使用变量索引访问列表?
Posted
技术标签:
【中文标题】如何在 Django 模板中使用变量索引访问列表?【英文标题】:How to access list using variable indexes in Django templates? 【发布时间】:2012-11-26 02:49:15 【问题描述】:比如说,我有两个对象列表,foo
和 bar
。在 Django 模板中,在循环通过 foo
时,有一个计数器跟踪当前索引/迭代,并且该计数器用于访问 bar
。这里的问题是我认为 Django 模板系统不支持使用变量索引访问列表。真的吗?如果是这样,是否有任何解决该问题的方法(除了使用硬编码索引重复同一段 html/模板代码)?
代码演示:
% for x in foo %
<span> x.name vs. bar. forloop.counter0 .name </span>
% endfor %
Django 模板不喜欢 bar. forloop.counter0 .name
注意:我使用的是 Django 1.4
【问题讨论】:
检查 Django 模板中的slice
过滤器。
【参考方案1】:
您是正确的,Django 模板不直接允许这样做,这是因为 Django 试图强迫您将几乎所有的表示逻辑放在您的视图中。您最好的选择是在您的视图中在您的上下文中创建一个字典列表,这样您就可以对其进行迭代并按名称访问成员。或者:
zip
将您的列表放在一起,而不是使它们成为字典并使用 % for fooItem, barItem in zippedList %
访问它们。
使用限制较少的模板语言,例如Jinja2
按照 Yuji Tomita 的建议使用自定义模板过滤器
【讨论】:
感谢您提及替代方案。谢谢。 感谢您的压缩评论;这正是我所需要的。【参考方案2】:是的,你不能解析变量名。绝对要非常努力地把这个逻辑放在视图中。
但在 5% 的情况下,我确实发现这有时会在视图中需要太多 逻辑/模板作者控制之外需要更改。我开始接受一些个人定制,允许在视图中分配变量以及简单的变量解析。
使用模板引擎“所有查找合为一体”系统(索引、属性、键)构建模板标签非常简单。
from django.template import Variable, VariableDoesNotExist
@register.assignment_tag()
def resolve(lookup, target):
try:
return Variable(lookup).resolve(target)
except VariableDoesNotExist:
return None
% resolve some_list some_index as value %
% resolve some_dict some_dict_key as value %
【讨论】:
绝对是比在视图中摆弄列表更干净的解决方案。谢谢。 -1 因为解决方案实际上并不完整。当还指定导入时,它总是很有帮助,而不是我不得不离开并解决它们。缺少的是:from django.template import Variable, VariableDoesNotExist
另外,如果 some_list
或 some_dict
是从另一个 forloop 生成的(即实际上不是变量),则它不起作用
谢谢帕特里克。许多答案不是完整的代码答案,而是想法,伪代码等,所以这是一个非常苛刻的等级。已更新。以上是关于如何在 Django 模板中使用变量索引访问列表?的主要内容,如果未能解决你的问题,请参考以下文章