在 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 模板中动态获取列表项的主要内容,如果未能解决你的问题,请参考以下文章