Python django模板使用模板变量作为索引获取列表项
假设一个Python django模板使用模板变量作为索引获取列表项,python,django,django-templates,Python,Django,Django Templates,假设一个list0包含元素['a'、'b'、'c'、'd'],我需要根据模板变量或模板中可用的任何其他整数获取第n个元素 到目前为止,我找到的更好的方法是创建一个自定义标记,如中所述或中所述。 定义后,您可以编写如下内容: {% for elm in list0 %} {{ elm }} {{ list1|index:forloop.counter0 }} {% endfor %} 该示例假设存在另一个列表list1,其中包含元素['A'、'B'、'C'、'D'] index是自定义筛选器的名
list0
包含元素['a'、'b'、'c'、'd']
,我需要根据模板变量或模板中可用的任何其他整数获取第n个元素
到目前为止,我找到的更好的方法是创建一个自定义标记,如中所述或中所述。定义后,您可以编写如下内容:
{% for elm in list0 %}
{{ elm }} {{ list1|index:forloop.counter0 }}
{% endfor %}
该示例假设存在另一个列表list1
,其中包含元素['A'、'B'、'C'、'D']
index
是自定义筛选器的名称,它使用forloop计数器作为索引来获取每个list1
元素:list1[0]
,list1[1]
,list1[2]
,list1[3]
这就产生了:
a A
b B
c C
d D
但是如果您只想使用内置过滤器呢?(或者有空余时间做娱乐活动?
经过一些研究和测试,我发现的唯一方法是这样一件奇怪的事情:
{% for elm in list0 %}
{% with sl0=forloop.counter0|make_list sl1=forloop.counter|make_list %}
{% with header_id=sl0.0|add:":"|add:sl1.0 %}
{{ elm }} {{ list1|slice:header_id|join:"" }}
{% endwith %}
{% endwith %}
{% endfor %}
它的作用是:
它使用内置过滤器。slice需要一个表示python列表部分的字符串,如'[2:3]
,它是由第二个with
和两个add
生成的。因此需要使用forloop计数器一次切片一个成员:'[0:1]'
,'[1:2]'
,'[2:3]
…但是forloop.counter0
和forloop.counter
是整数,在这种情况下,add
不会生成字符串。它试图得到一个整数作为结果。因此需要将其转换为字符串。这就是为什么在第一个中使用make_list
,因为这是迄今为止我发现的唯一一种将整数转换为字符串的方法。最后,slice返回一个包含一个元素的列表,因此它使用连接:
将其转换为字符串
我希望我在文档中遗漏了一些东西,因为上面的代码是。。好。。很可怕,但很有趣
如何使用django模板内置项以有效的方式满足这一需求?
我同意在视图中而不是在模板中构建上下文时应该处理它,但我们可以说这是不可能的。在模板中不应该这样做,模板是用于呈现逻辑的,它取决于视图提供正确的结构。我们可以通过以下方式做到这一点:
从django.exe导入渲染
定义我的视图(请求):
列表0=['a','b','c','d']
列表1=['A','B','C','D']
list01=zip(list0,list1)
返回呈现(请求'some_template.html',{'list01':list01})
然后使用以下命令渲染此内容:
{% for elm0, elm1 in list01 %}
{{ elm0 }} {{ elm1 }}
{% endfor %}
{%elm0,列表01%中的elm1}
{{elm0}}{{elm1}}
{%endfor%}
在视图zip_obj=zip(list0,list1)
中,在模板{%for elm0,elm1 In zip_obj%}
中,为什么所有这些索引以及模板中没有的内容?您也没有遗漏文档中的任何内容,因为将模板与逻辑分离是一个深思熟虑的设计决策。@AbdulAzizBarkat:是的,这是为了避免这里发生的事情,人们编写复杂的代码,通常需要大量的周期。谢谢。在我的问题中,请注意“我同意在视图中而不是在模板中构建上下文时应该处理它,但假设它无法完成。”。显然我知道zip()。另外,既然有一个切片模板过滤器,为什么不使用索引过滤器呢?谢谢,但请参阅我上面的评论
{% for elm0, elm1 in list01 %}
{{ elm0 }} {{ elm1 }}
{% endfor %}