【问题标题】:Django: Create a variable in templateDjango:在模板中创建一个变量
【发布时间】:2011-03-12 13:19:08
【问题描述】:

我有一个想要在 django 模板中显示的值列表。

列表或多或少是这样的:

199801 string1
199802 string2
199904 string3
200003 string4
200011 string5

第一列是格式为 YYYYMM 的日期,第二列是通用字符串

列表按日期顺序排列

我要创建的是按年份分组的 stringx 列表 像这样:

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

我认为我找到的唯一方法是编写一个自定义模板标签并让它存储变量和值...但是在开始编写代码之前我想知道是否有更简单的方法!

【问题讨论】:

  • 你应该这样做。来自 Django 文档:模板系统旨在表达演示,而不是程序逻辑。

标签: django django-templates


【解决方案1】:

总是在视图中做这样的事情,模板系统不是为这样的操作而设计的。此外,要实现这一点要困难得多——我想到的最好的主意是创建一个过滤器。但是,那将是疯狂的——您将创建一个非常特定的过滤器,仅用于一种用途。在视图中很容易实现:

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】:

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

    【讨论】:

    • 哇,这个 groupby 迭代器很棒 :-)
    【解决方案3】:

    根据设计,您不能在视图中创建变量。

    但是 ifchanged 标签可能会满足您的需求:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 2020-01-08
      • 2018-05-07
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2021-06-17
      相关资源
      最近更新 更多