我有一个格式['DD','MM','YYYY']的日期列表,并将其保存到名为listdates [['DD','MM','YYYY'],[''的元组中DD','MM','YYYY']]
我想制作一个像这样的HTML
<li class="year">
<a href="#">2013</a>
<ul>
<li class="month">
<a href="#">11</a>
<ul>
<li class="day">01</li>
<li class="day">02</li>
<li class="day">03</li>
...
</ul>
</li>
<li class="month">
<a href="#">12</a>
<ul>
<li class="day">01</li>
<li class="day">02</li>
...
</ul>
</li>
</ul>
</li>
我已经尝试了一天,但还没找到方法。是否有捷径可寻 ?或者我应该更改数据结构?
答案 0 :(得分:4)
您应该更改数据结构。像这样的复杂数据处理属于Python而不是模板。你会发现在Jinja 2中可能有办法破解它(虽然可能不是在Django的模板中)。但你不应该这样做。
而是创建嵌套数据结构
dates = [[d1, m1, y1], ..., [dn, mn, yn]]
datedict = {}
for d, m, y in dates:
yeardict = datedict.setdefault(y, {})
monthset = yeardict.setdefault(m, set())
monthset.add(d)
nested_dates = [(y, list((m, sorted(days))
for m, days in sorted(yeardict.items())))
for y, yeardict in sorted(datedict.items())]
所以,如果dates
开头为
dates = [[1, 2, 2013], [5, 2, 2013], [1, 3, 2013]]
nested_dates
最终将成为
[(2013, [(2, [1, 5]), (3, [1])])]
所以你可以做到
{% for year in nested_dates %}
<li class="year">
<a href="#">{{year.0}}</a>
<ul>
{% for month in year.1 %}
<li class="month">
<a href="#">{{month.0}}</a>
<ul>
{% for day in month.1 %}
<li class="day">{{day}}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
</li>
{% endfor %}
注意:如果你希望你的代码在以后有意义,或者给另一个程序员,那么列表理解正在推动你在列表理解中应该做的事情的极限。所以你可以写得更清楚:
nested_dates = []
for y, yeardict in sorted(datedict.items()):
yearlist = []
for m, days in sorted(yeardict.items()):
yearlist.append((m, sorted(days)))
nested_dates.append((y, yearlist))
一般来说,任何以“如何让我的模板系统在此结构中输出数据”的问题的答案是“在该结构中提供数据”。
答案 1 :(得分:4)
为什么不使用pythons内置日期数据类型?
from datetime import date
# list your dates
l = [date(2013, 12, 1), date(2013, 8, 28), ]
l.sort()
template = env.get_template('mytemplate.html')
print template.render(dates=l)
{% for year_group in dates|groupby('year') %}
{% for by_year in year_group.list %}
<li class="year">
<a href="#">by_year.year</a>
<ul>
{% for month_group in by_year|groupby('month') %}
{% for by_month in month_group.list %}
<li class="month">
<a href="#">by_month.month</a>
<ul>
{% for day_group in by_month|groupby('day') %}
{% for by_day in day_group.list %}
<li class="day">by_day.day</li>
{% endfor %}
{% endfor %}
</ul>
</li>
{% endfor %}
{% endfor %}
</ul>
</li>
{% endfor %}
{% endfor %}