Django: создать переменную в шаблоне - PullRequest
2 голосов
/ 07 июля 2010

У меня есть список значений, которые я хочу отобразить в шаблоне django.

Список более или менее похож на этот:

199801 string1
199802 string2
199904 string3
200003 string4
200011 string5

, где первый столбец является датойв форме ГГГГММ, а вторая представляет собой общую строку

список упорядочен по дате desc

То, что я хочу создать, это список строк x, сгруппированных по годам, примерно так:

1998 string1, string2
1999 string3
2000 string4, string5

Я посмотрел документацию и думаю, что единственное, что мне нужно, - это способ создать переменную, в которой будет храниться напечатанный мной "прошлый год", чтобы я мог сделать что-то вроде:

if current_value.year != last_year
     #create a new row with the new year and the string
else
     #append the current string to the previous one

Я думаю, что единственный способ, который я нашел, - написать собственный тег шаблона и позволить ему сохранить переменную и значение ... но прежде чем начать писать код, я хотел бы знать, есть ли более простой способ!

Ответы [ 3 ]

5 голосов
/ 07 июля 2010

Всегда делайте это с виду, система шаблонов не предназначена для таких операций. Кроме того, было бы гораздо сложнее добиться этого - лучшая идея, которая приходит мне в голову, это создать фильтр. Это, однако, было бы сумасшествием - вы бы создали очень специфический фильтр только для одного использования. Это очень легко достичь:

last = None
result = []
for year, value in tuples:
    if year[0:4] == last:
        result[-1].append(value)
    else:
        result.append([value])
        last = year[0:4]
2 голосов
/ 07 июля 2010

с помощью itertools groupby

l = [
    (199801, 'string1'),
    (199802, 'string2'),
    (199904, 'string3'),
    (200003, 'string4'),
    (200011, 'string5'),
]

from itertools import groupby
iterator = groupby(l, key=lambda item: str(item[0])[:4])

for year, str_list in iterator:
    print year, list(str_list)

output

1998 [(199801, 'string1'), (199802, 'string2')]
1999 [(199904, 'string3')]
2000 [(200003, 'string4'), (200011, 'string5')]
0 голосов
/ 07 июля 2010

Вы не можете создать переменную в представлении по дизайну.

Однако тег ifchanged, вероятно, выполняет то, что вы хотите:

{% for val in values %}
  {% ifchanged val.0 %} {{val.0}} {% endifchanged %}
  {{ val.1 }}
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...