Django模板循环语言

时间:2018-08-26 16:26:05

标签: django django-templates jinja2

所以我有一个使用模板变量的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)

1 个答案:

答案 0 :(得分:1)

reversed(..)不会构造元素的集合:它是一个 iterator ,因此这意味着它会迭代某些内容(并产生元素),并且如果已用尽,则没有(直接)方法可以重复进行枚举。

因此,您需要在某种集合中(例如,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)

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

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现在是一个集合,而不是一个迭代器。一个人可以(通常)枚举一个集合任意次(这肯定适用于list s和tuple s)。