язык шаблонов django для циклов - PullRequest
0 голосов
/ 26 августа 2018

, поэтому у меня есть 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 голосов
/ 26 августа 2018

reversed(..) действительно не создает коллекцию элементов: это итератор , так что это означает, что он выполняет итерации по чему-то (ну, это дает элементы), и если этоисчерпан, нет (прямого) способа повторить перечисление.

Таким образом, вам нужно материализовать итератор в некоторой коллекции, например list или tuple, например:

def organization_reports(request):
    now = datetime.datetime.now()
    years = <b>list(</b>reversed(["{0}".format(year) for year in range(now.year-7,now.year)])<b>)</b>
    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 <b>reversed(</b>range(now.year-7,now.year)<b>)</b>]
    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(<b>now.year-1,now.year-8, -1</b>)]
    my_dict = {"years" : years}
    return render(request, 'organization_reports/organization.html', my_dict)

Независимо от того, как мы его сконструируем, в результате получается, что years теперь является коллекцией , а не итератор .Можно (обычно) перечислить коллекцию произвольное количество раз (и это определенно верно для list с и tuple с).

...