Доступ к параллельным массивам в шаблонах Django?

Код моего представления выглядит примерно так:

context = Context() 
context['some_values'] = ['a', 'b', 'c', 'd', 'e', 'f']
context['other_values'] = [4, 8, 15, 16, 23, 42]

Я бы хотел, чтобы код моего шаблона выглядел так:

{% for some in some_values %} 
  {% with index as forloop.counter0 %} 
    {{ some }} : {{ other_values.index }} <br/> 
  {% endwith %} 
{% endfor %} 

И я ожидал, что это выведет:

a : 4 <br/> 
b : 8 <br/> 
c : 15 <br/> 
d : 16 <br/> 
e : 23 <br/> 
f : 42 <br/> 

Это возможно? Я обнаружил, что мой оператор «with» действительно работает, но затем использование этой переменной в качестве ссылки не работает. Я подозреваю, что для {{other_values.index}} он делает other_values ​​['index'] вместо other_values ​​[index]. Это возможно?


person slacy    schedule 14.01.2010    source источник
comment
Я всегда мог бы написать собственный тег шаблона для этого варианта использования, но это кажется излишним. Мне не хотелось бы говорить {{other_values ​​| access: index}}.   -  person slacy    schedule 14.01.2010


Ответы (1)


zip(some_values, other_values), затем используйте его в шаблоне

from itertools import izip
some_values = ['a', 'b', 'c', 'd', 'e', 'f']
other_values = [4, 8, 15, 16, 23, 42]
context['zipped_values'] = izip(some_values, other_values)

{% for some, other in zipped_values %}
    {{ some }}: {{ other }}  <br/>
{% endfor %}
person Antony Hatchkins    schedule 14.01.2010
comment
Вместо этого я бы использовал itertools.izip. - person Cat Plus Plus; 14.01.2010
comment
Я бы предпочел не добавлять больше к контексту, и это делает данные контекста довольно избыточными. Кроме того, если я изменю свой шаблон (скажем, чтобы больше не иметь доступа к этим параллельным массивам), я должен не забыть очистить код представления. Такое ощущение, что он балансирует между данными и презентацией. - person slacy; 14.01.2010
comment
@slacy: Ваш вопрос касается не только презентации. Связь между элементами важна в двух параллельных массивах. Параллельные массивы на самом деле представляют собой просто двухкортежные кортежи, ожидающие своего создания. Вы должны объединить их в функции просмотра, потому что логически они абсолютно взаимосвязаны. Вот почему вы представляете их вместе. - person S.Lott; 14.01.2010
comment
@PiotrLegnica: абсолютно. Фиксированный. Также с izip не будет создаваться огромная новая структура в памяти. - person Antony Hatchkins; 14.01.2010