使用Django构建HTML日历视图

0 投票
4 回答
4708 浏览
提问于 2025-04-16 22:14

我正在用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的文档,...

默认情况下,这些日历把星期一当作一周的第一天,把星期天当作最后一天(这是欧洲的习惯)。

撰写回答