Django 将事件附加到日历中的日期?

Django attaching events to days in a calendar?

我已经构建了一个基本日历,它使用内置的 calendar.Calendar 函数生成当前月份的 table(取自 URL),但我想将事件附加到生成的日期。最好的方法是什么?

目前我认为:

def view_calendar(request, year=None, month=None):
    events = Event.objects.filter(creator=request.user)
    new_event_form = EventForm()
    now = datetime.date.today()
    if year:
        year = int(year)
    else:
        year = now.year
    if month:
        month = int(month)
    else:
        month = now.month

    cal = calendar.Calendar(calendar.SUNDAY)
    month_days = cal.monthdatescalendar(year, month)

    args = {'events': events, 'month': month, 'year': year, 'month_days': month_days}
    args.update(csrf(request))
    args['new_event_form'] = new_event_form
    return render(request, 'calendar.html', args)

在我的模板中,我可以这样调用星期和日期:

<table cellpadding="3" width="100%">
    <tr>
        <td>Sunday</td>
        <td>Monday</td>
        <td>Tuesday</td>
        <td>Wednesday</td>
        <td>Thursday</td>
        <td>Friday</td>
        <td>Saturday</td>
    </tr>
    {% for week in month_days %}
        <tr>
            {% for day in week %}
                <td>
                    {{day|date:"j"}}<br />
                </td>
            {% endfor %}
        </tr>
    {% endfor %}
</table>

我想做的是在我看来有这样的事情:

for week in month_days:
        for day in week:
            day['events'] = list(Event.objects.filter(creator=request.user, start_date=day))

但是我得到这个错误: 类型错误:'datetime.date' 对象不支持项目分配

有没有一种方法可以轻松地将这些日子转换为支持项目分配的对象,以便我可以将事件附加到这些日子并将它们添加到日历中?

谢谢今天正在计算的任何人,祝大家圣诞节快乐。

你不能使用像字典这样的日期类型对象。

    day['events'] = xxx

相反,你可以做类似的事情

    events = [(day, Event.objects.filter(creator=request.user,  start_date=day)) 
              for day in [week for week in month_days]]

并在模板中使用它

    {% for week in events %}
    <tr>
        {% for day, events in week %}
            <td>
                {{day|date:"j"}}<br />
                {% for event in events %}
                     {{ event }}<br/>
                {% endfor %}

            </td>
        {% endfor %}
    </tr>
   {% endfor %}

我根据 delta32 的建议让它工作了。我需要创建一个空的 Events 字典,然后通过我的 foor 循环在 运行 之后将每个星期附加到 events 字典。这给我留下了:

events = []
for week in month_days:
    week_events = [(day, TSEvent.objects.filter(created_by=request.user, date_start=day)) for day in week]
    events.append(week_events)

然后,在日历模板中:

{% for week in events %}
<tr>
    {% for day, events in week %}
        <td>
            <a href="/ts/calendar/{{day|date:"Y"}}/{{day|date:"m"}}/{{day|date:"j"|leading_zeros:"2"}}/">
                {{day|date:"j"}}
            </a>
            <br />
            {% for event in events %}
                <p><a href="/apps/timesweet/events/{{event.id}}/"><b>{{event.name}}</b></a></p>
            {% endfor %}
        </td>
    {% endfor %}
</tr>
{% endfor %}