【问题标题】:django template get a list item using a template variable as indexdjango模板使用模板变量作为索引获取列表项
【发布时间】:2021-07-23 16:49:24
【问题描述】:

假设list0 带有元素['a','b','c','d'],我需要根据forloop.counter0 之类的模板变量或模板中可用的任何其他整数来获取第n 个元素。

到目前为止,我发现更好的方法是创建自定义标签,如 hereheredjango doc 中所述。
定义后,您可以编写如下内容:

{% for elm in list0 %}
{{ elm }} {{ list1|index:forloop.counter0 }}
{% endfor %}

该示例假设有另一个列表list1,其中元素['A','B','C','D']
index 是自定义过滤器的名称,它使用forloop 计数器作为索引来获取每个list1 元素:@ 987654334@、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 内置过滤器。 slice 需要一个表示 python 列表部分的字符串,如'[2:3]',它由第二个with 和两个add 生成。因此,需要使用 forloop 计数器一次切一个成员:'[0:1]''[1:2]''[2:3]'...但forloop.counter0forloop.counter 是整数,而add 不会在这个案例。它试图得到一个整数作为结果。因此需要将其转换为字符串。这就是为什么在第一个with 中使用make_list 的原因,因为这是迄今为止我发现的将整数更改为字符串的唯一方法。最后切片返回一个包含一个元素的列表,因此它使用join:"" 进行转换它是一个字符串。

我希望我错过了文档中的某些内容,因为上面的代码......好吧......很糟糕 - 但很有趣。

如何使用 django 内置模板有效地满足这一需求?
我同意在视图中而不是模板中构建上下文时应该解决它,但是假设它不能完成。

【问题讨论】:

  • 在视图zip_obj = zip(list0, list1) 中,在模板{% for elm0, elm1 in zip_obj %} 中,为什么所有这些索引都在模板中而不在模板中?此外,您没有错过文档中的任何内容,因为将模板与逻辑分开是经过深思熟虑的设计决定。
  • @AbdulAzizBarkat:是的,这正是为了防止这里发生的事情,人们编写复杂的代码,这通常需要很多周期。
  • 谢谢。在我的问题中,请注意“我同意在视图中而不是模板中构建上下文时应该解决它,但假设它不能完成。”。显然我知道 zip()。另外,既然有一个切片模板过滤器,为什么没有一个索引呢?

标签: python django django-templates


【解决方案1】:

您不应该在模板中执行此操作,模板用于渲染 逻辑,它由视图提供正确的结构。我们可以通过zip(…) 做到这一点:

from django.shortcuts import render

def my_view(request):
    list0 = ['a', 'b', 'c', 'd']
    list1 = ['A', 'B', 'C', 'D']
    list01 = zip(list0, list1)
    return render(request, 'some_template.html', {'list01': list01})

然后使用:

{% for elm0, elm1 in list01 %}

{{ elm0 }} {{ elm1 }}

{% endfor %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-25
    • 2012-11-02
    • 2012-11-06
    • 2011-06-06
    • 2011-01-30
    • 2012-11-26
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多