Django:在模板中创建一个变量

时间:2010-07-06 21:49:31

标签: django django-templates

我有一个值列表,我希望在django的模板中显示。

列表或多或少是这样的:

199801 string1
199802 string2
199904 string3
200003 string4
200011 string5

其中第一列是YYYYMM形式的日期,第二列是通用字符串

列表按日期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 个答案:

答案 0 :(得分:5)

总是做这样的事情,模板系统不是为这样的操作而设计的。此外,实现这一点要困难得多 - 我想到的最好的想法是创建一个过滤器。然而,这将是疯狂的 - 你只需一次使用就可以创建一个非常具体的过滤器。在视图中很容易实现:

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]

答案 1 :(得分:2)

使用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)

输出

1998 [(199801, 'string1'), (199802, 'string2')]
1999 [(199904, 'string3')]
2000 [(200003, 'string4'), (200011, 'string5')]

答案 2 :(得分:0)

您无法在设计中在视图中创建变量。

但是ifchanged标记可能会执行您想要的操作:

{% for val in values %}
  {% ifchanged val.0 %} {{val.0}} {% endifchanged %}
  {{ val.1 }}
{% endfor %}