'Building html calendar view using django

I am trying to build a calendar view using django and trying to avoid writing any html tags inside my view. I found a code that helped me get there,

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

and in my view, i did the following

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

Now, the above code is printing the calendar as per the month and year parameters but they are appearing wrong. When I compare it with the calendar, using december 2011, the first day of the month starts at thursday while in calendar its starting on wednesday. can anyone help point out what I did wrong here?

UPDATE

It seems like the problem is coming from itermonthdays. I tried to do the following

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

I don't know if I should change some sort of a settings or initiate the class differently. But, the output should start with 4 zeros and end with none based on my PC calendar it shows that december 2011 starts on a thursday which is the 5th day of the week therefore there should be 4 zeros before the count starts. hmm any advice on how i can tackle this issue?



Solution 1:[1]

It looks to me like your problem is simply that itermonthdays starts with Monday instead of Sunday. You can confirm this by temporarily replacing

itermonthdays

with

itermonthdates

and

lst[week].append(day)

with

lst[week].append(day.strftime("%A")))

This should temporarily replace day numbers with day of the week names.

Edit: One possible solution to your problem is to initialize lst to [[0]] and then set lst=lst[:-1] at the end of your loop.

Solution 2:[2]

When I compare it with the calendar, using december 2011, the first day of the month starts at thursday while in calendar its starting on wednesday. can anyone help point out what I did wrong here?

I have bad new for you, the first day of december 2011 is thursday, according my windows calendar

Solution 3:[3]

I recently made a calendar to display latest month days

views.py
def index(request):
    x=str(datetime.now())
    d0 = datetime(year=date.fromisoformat(x.split(' ')[0]).year, month=date.fromisoformat(x.split(' ')[0]).month, day=1)
    d1 = datetime(year=date.fromisoformat(x.split(' ')[0]).year, month=date.fromisoformat(x.split(' ')[0]).month+1, day=1)
    cal = Calendar()
    lst = [[]]
    week = 0
    cal.setfirstweekday(0)
    monthly_days = cal.itermonthdates(date.fromisoformat(x.split(' ')[0]).year, date.fromisoformat(x.split(' ')[0]).month)
    month1=date.fromisoformat(x.split(' ')[0]).month
    year1=date.fromisoformat(x.split(' ')[0]).year
    for day in monthly_days:
        if len(lst[week])<7:
            if int(day.strftime('%m'))!=int(str(month1)):
                lst[week].append(' ')
            else:
                lst[week].append(day.strftime('%d'))
        else:
            week+=1
            if int(day.strftime('%m'))!=int(str(month1)):
                lst.append([' '])
            else:
                lst.append([day.strftime('%d')])
    return render(request,'base.html',{'monthly_days':lst})

base.html

<body>
    <h1>
        Hi!!!!
    </h1>
    <h2>
        Welcome to Calendar
    </h2>
        <div>
            <table>
                <tr>
                    <td><span class="day_name">M</span></td>
                    <td><span class="day_name">T</span></td>
                    <td><span class="day_name">W</span></td>
                    <td><span class="day_name">T</span></td>
                    <td><span class="day_name">F</span></td>
                    <td><span class="day_name">S</span></td>
                    <td><span class="day_name">S</span></td>
                </tr>
                {% for week in monthly_days %}
                    <tr>
                    {% for day in week %}
                        <td><span class="date">{{ day }}</span></td>
                    {% endfor %}
                    </tr>
                {% endfor %}
            </table>
        </div>
</body>

This is for a tabular format

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Viller
Solution 3