在 Django 模板中动态获取列表项

Posted

技术标签:

【中文标题】在 Django 模板中动态获取列表项【英文标题】:Get list item dynamically in django templates 【发布时间】:2012-02-15 10:23:21 【问题描述】:

我在页面上有一些循环,需要列表项,具体取决于循环编号。

当我打电话时:

 mylist.1 
 mylist.2 
 mylist.3 

一切正常,但我真正需要的是:

% for x in somenumber|MyCustomRangeTag %
     mylist.x 
% endfor %

MyCustomRangeTag 给了我 Python range() 它可以工作,我已经有 x 作为数字。所以x 是 1、2、3 等,具体取决于循环编号。 这可能吗?如何实现?

【问题讨论】:

你能在视图中传递你需要的值吗?如果您事先知道范围,为什么不直接传递您尝试显示的确切值? 不,在这种情况下我不能。它是硬编码的自定义购物车页面,所有这些都是一些嵌套表单的一部分。 【参考方案1】:

这是不可能的,因为 Django 认为 "x" 是在 mylist 中查找的关键——而不是 x 的 。因此,当x = 5 时,Django 会尝试查找mylist["x"] 而不是mylist[5]

使用以下过滤器作为解决方法:

@register.filter
def lookup(d, key):
    return d[key]

并像使用它

 mylist|lookup:x 

【讨论】:

如果 mylist|lookup:x 的输出是一个对象,我还需要访问一些东西怎么办?类似mylist.1.first_name @zengr 试试% with lookup_result=mylist|lookup:x %lookup_result.first_name% endwith %【参考方案2】:

我注意到@e-satis 提到了它,但我认为内置的切片模板标签值得爱。

 item | slice:"2"  #gets the third element of the list

【讨论】:

这可能以前有效,但是当我用 django 1.5 试一试时给出了一些时髦的结果 这对我不起作用,但 some_list|slice:":2" 成功了 --docs.djangoproject.com/en/1.7/ref/templates/builtins/#slice @Hayden 我相信只获取列表的前两个元素?我更新了代码以修复过滤器语法。 这会获取列表的第三个元素,但是当您要使用的索引存储在 var 中时,仍然无法从列表中获取元素 % with "2" as var % mylist | slice: var % endwith %【参考方案3】:

你确定你不能这样做:

% for item in mylist %
     item 
% endfor %

使用切片过滤器,您甚至可以进行一些自定义。

【讨论】:

我认为您的意思是在第二行添加 item 。这里还值得注意的是,如果出于某种原因需要索引,可以在循环中使用 forloop.counter 哈哈,不用担心。不过,感谢您的提示。实际上,我并没有被您的代表吓倒,我只是忘记了我们可以编辑答案。不过,当我将来感到害羞时,这会激励我。【参考方案4】:

Django 模板中的 slice 标签可能使用 python 的切片代码,但语法明显不同。例如,如果你想获得一个带有变量的序列的元素,在 python 中你会写类似下面的代码:

>>>mylist = ["0th Element", "1th Element"]
>>>zero, one = 0, 1
>>>mylist[zero]
"0th Element"
>>>mylist[one]
"1th Element"

将这种语法与 Django 切片模板标签一起使用将在每种情况下返回一个切片列表,对于获取已知索引项的可疑实用程序:

% with "0" as zero %
% with "1" as one %
% with "2" as two %

mylist|slice:zero mylist|slice:one mylist|slice:two

% endwith %
% endwith %
% endwith %

渲染到 html

[] ["0th Element"] ["0th Element", "1th Element"]

注意区别:你得到的是mylist[:x]而不是mylist[x]的结果。

Django 提供了足够的工具来解决这个问题。第一个技巧是使用像0:1 这样的显式切片作为索引,然后使用|join:"" 将结果列表放入单个元素中。像这样:

% with "0:1" as zero %
mylist|slice:zero|join:""
% endwith %

产量:

0th Element

如果您在处理子循环内的可迭代对象时需要访问父循环的索引,这会特别方便:

% for parent in parent_loop %
    % cycle "0:1" "1:2" "2:3" as parent_loop_index silent %
    % for child in child_loop %
        child|slice:parent_loop_index|join:""
    % endfor %
% endfor %

除了库存零件外什么都没有完成,虽然我认为 Django 还没有实现成就。

【讨论】:

【参考方案5】:

以下对我有用

% for 1,2,3 in mylist %
# do stuff

只是不要在 1,2,3 周围使用括号

【讨论】:

以上是关于在 Django 模板中动态获取列表项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 javascript(或类似的)在 Django 模板中切片列表项

django模板获取字典项

模板中的 Django 动态对象过滤问题

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

如何获取相关项目的列表并在 Django 中应用模板过滤器

如何在 django 模板中获取 for 循环内的列表的下一个元素?