使用Django构建HTML日历视图
我正在用Django构建一个日历视图,并且想尽量避免在视图中写任何HTML标签。我找到了一段代码,帮助我实现了这个目标,
from datetime import date, datetime, timedelta, time
import calendar
year=2011
month=12
change=None
# init variables
cal = calendar.Calendar()
month_days = cal.itermonthdays(year, month)
lst = [[]]
week = 0
# make month lists containing list of days for each week
# each day tuple will contain list of entries and 'current' indicator
for day in month_days:
lst[week].append((day))
if len(lst[week]) == 7:
lst.append([])
week += 1
在我的视图中,我做了以下操作:
<div class="calendar_panel_bottom_noborder">
<span class="month">Juny 2011</span>
<span class="day_name">S</span>
<span class="day_name">M</span>
<span class="day_name">T</span>
<span class="day_name">W</span>
<span class="day_name">T</span>
<span class="day_name">F</span>
<span class="day_name">S</span>
{% for week in month_days %}
{% for day in week %}
<span class="date">{{ day }}</span>
{% endfor %}
{% endfor %}
<div class="clear"></div>
</div>
现在,上面的代码根据月份和年份的参数打印出日历,但显示的结果不对。当我用2011年12月做对比时,发现这个月的第一天是星期四,而日历上却显示是星期三。有人能帮我指出我哪里出错了吗?
更新
看起来问题出在itermonthdays这个函数上。我尝试做了以下操作:
>>> month_days = cal.itermonthdays(2011, 12)
>>> for day in month_days:
... print day
...
0
0
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
0
我不知道是不是应该更改某些设置,或者以不同的方式初始化这个类。但是,输出结果应该是以4个零开始,并且在我的电脑日历上显示2011年12月是从星期四开始的,也就是一周的第5天,所以在计数开始之前应该有4个零。嗯,有什么建议可以帮我解决这个问题吗?
4 个回答
0
当我用2011年12月的日历来对比时,这个月的第一天是星期四,但在日历上显示的是星期三。有人能帮我指出我哪里搞错了吗?
我有个坏消息告诉你,2011年12月的第一天确实是星期四,这是根据我电脑上的日历显示的。
1
看起来你的问题就是 itermonthdays
是从星期一开始的,而不是星期天。你可以通过暂时把
itermonthdays
替换成
itermonthdates
并且把
lst[week].append(day)
替换成
lst[week].append(day.strftime("%A")))
来确认这一点。
这样做会暂时把日期数字换成星期几的名称。
补充:解决你问题的一个方法是把 lst
初始化为 [[0]]
,然后在循环结束时设置 lst=lst[:-1]
。
3
你需要在
cal.setfirstweekday(6)
之前加上
monthdays = ...
根据Python的文档,...
默认情况下,这些日历把星期一当作一周的第一天,把星期天当作最后一天(这是欧洲的习惯)。