用于循环的 django 模板语言

Posted

技术标签:

【中文标题】用于循环的 django 模板语言【英文标题】:django template language for loops 【发布时间】:2019-02-01 08:00:03 【问题描述】:

所以我有一个使用模板变量的 html 代码。出于某种原因,在我遍历模板变量之后,列表是空的?是否需要将指针重置为模板变量的索引0?谢谢!第二个选择没有可迭代的内容,也没有选项值。 Years 就是这样的数组[2015,2016,2017,2018]

<select data-placeholder="Choose Year 1..." id="yr1">
   % for year in years %
   <option value="year">year</option>
   % endfor %
</select>
<h4 style="margin-bottom: 0px; margin-right: 20px; margin-left: 20px">to</h4>
<select data-placeholder="Choose Year 2..." id="yr2">
   % for year in years %
   <option value="year">year</option>
   % endfor %
</select>

这里是风景

def organization_reports(request):
 now = datetime.datetime.now()
 years = reversed(["0".format(year) for year in range(now.year-7,now.year)])
 my_dict = "years" : years
 return render(request, 'organization_reports/organization.html', my_dict)

【问题讨论】:

这可能是因为它不是一个列表,而是一个生成器。 Python 中的生成器会传递一次 的元素。但是您需要显示生成 years 的视图才能确定。 类类型是 那么合乎逻辑:reversed(..) 确实是一个生成器。您需要将其具体化(例如,将其转换为list(..) 以使其可多次迭代。 【参考方案1】:

reversed(..) 确实构造了一个元素集合:它是一个迭代器,所以这意味着它迭代某些东西(它产生元素),如果已经用尽了,没有(直接)方法可以重复枚举。

因此,您需要在某种集合中具体化迭代器,例如listtuple,例如:

def organization_reports(request):
    now = datetime.datetime.now()
    years = list(reversed(["0".format(year) for year in range(now.year-7,now.year)]))
    my_dict = "years" : years
    return render(request, 'organization_reports/organization.html', my_dict)

或者我们可以通过逆向 range(..) 对象本身来构造list,它只需要枚举一次:

def organization_reports(request):
    now = datetime.datetime.now()
    years = ["0".format(year) for year in reversed(range(now.year-7,now.year))]
    my_dict = "years" : years
    return render(request, 'organization_reports/organization.html', my_dict)

或者我们甚至可以在 range(..) 对象本身中编码反转:

def organization_reports(request):
    now = datetime.datetime.now()
    years = ["0".format(year) for year in range(now.year-1,now.year-8, -1)]
    my_dict = "years" : years
    return render(request, 'organization_reports/organization.html', my_dict)

不管我们如何构造它,结果是years 现在是一个集合,而不是一个迭代器。可以(通常)枚举一个集合任意次数(这绝对适用于lists 和tuples)。

【讨论】:

以上是关于用于循环的 django 模板语言的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板语言:使用带有 else 的 for 循环

如何在 Django 模板语言中正确构建 for 循环

Django中级篇之模板语言

Django模板语言-Tags

Django 2021年最新版教程25模板语言 前端for循环怎么用 实例

py18_06:Django之模板语言