如何在 Django 模板中使用变量索引访问列表?

Posted

技术标签:

【中文标题】如何在 Django 模板中使用变量索引访问列表?【英文标题】:How to access list using variable indexes in Django templates? 【发布时间】:2012-11-26 02:49:15 【问题描述】:

比如说,我有两个对象列表,foobar。在 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_listsome_dict 是从另一个 forloop 生成的(即实际上不是变量),则它不起作用 谢谢帕特里克。许多答案不是完整的代码答案,而是想法,伪代码等,所以这是一个非常苛刻的等级。已更新。

以上是关于如何在 Django 模板中使用变量索引访问列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在列表 django 模板列表中使用变量

如何在 Django 模板中访问字典列表

Django-jinjia2的赋值

如何在freemarker模板中按索引获取列表项?

如何使用Django模板在javascript中访问ajax jquery中的模板变量

循环中的 Django 计数器以索引列表