1

我正在尝试建立一个每周持续的小型活动日历。我有本周从星期一开始到星期日结束

这是我的模型Event

class Event(models.Model):
    title = models.CharField(max_length=40)
    start = models.DateTimeField(default=datetime.datetime.now)
    end = models.DateTimeField(default=datetime.datetime.now)

    def __unicode__(self):
        return self.title

这是我以这种格式显示日期的视图(10 月 21 日、10 月 22 日、10 月 23 日、10 月 24 日、10 月 25 日、10 月 26 日、10 月 27 日)

def events(request, template_name):
    today = datetime.date.today()
    weekday = today.weekday()
    start_delta = datetime.timedelta(days=weekday)
    start_of_week = today - start_delta
    week_dates = []
    for i in range(7):
        week_dates.append(start_of_week + datetime.timedelta(days=i))
    return render(request, template_name, {
        'week_dates': week_dates,
    })

我的问题是,如何在该周的特定日期显示/附加事件?例如,假设用户选择start日期为 10 月 22 日,end日期为 10 月 26 日,如何在相应日期下查询和显示?

这是我现在的简单模板代码,这需要更改样式,但为了这个问题,这里是最简单的形式:

    <div id="events">
        {% for d in week_dates %}
            {% for event in events %}
                {{ event.title}}
            {% endfor %}
            {{ d }}
        {% endfor %}
    </div>
4

3 回答 3

1

在查询您的事件并使其结束日期时间等于一天的开始后,您可以检查 enddate 是否小于 for 循环中的当前日期。如果我明白你的意思,例如

<div id="events">
    {% for d in week_dates %}
        {% for event in events %}
            {% if event.end < d %}
            {{ event.title}}
            {%endif%}

        {% endfor %}
        {{ d }}
    {% endfor %}
</div>
于 2013-10-22T19:40:17.140 回答
1

我从您的问题中了解到的是您想要显示事件日历。

在我看来,我会做这样的事情:

 start_week  = date_a - timedelta(days = date_a.weekday())
 end_week    = date_b + timedelta(days = (7-date_b.weekday()))
 events = Event.objects.filter(Q(start_date__range=[start_week,end_week]) | end_date__range=[start_week, end__week])

event_map = {}

for i in range(7):
    event_map[(start_week + datetime.timedelta(days=i))] = []

for event in events:

    if event.end_date in event_map.keys() and event.start_date not in event_map.keys():
        day_count = (event.end_date - start_week).days
        for i in range(day_count):  
            event_map[event.end_date - timedelta(days=i)].append(event)

    if event.start_date in event_map.keys() and event.end_date not in event_map.keys():
        day_count = (end_week - event.start_date).days
        for i in range(day_count):
            event_map[event.start_date + timedelta(days=i)].append(event)

    else:
        day_count = event.end_date - event.start_date:
        for i in range(day_count):
            event_map[event.start_date+timedelta(days=i)].append(event)

现在您可以在模板中使用 event_map 作为:

{% for key,value in event_map.items %}
{{key}} -
 {% for i in value %}
  {{i}}
{%endfor%}
 <br>
{% endfor %}

我没有在项目中尝试过这个,但逻辑对我来说似乎很好。希望能帮助到你 :)

于 2013-10-22T20:33:11.273 回答
0

只需将其放在以逗号分隔的查询中即可。您可以使用完整的日期、日期、月份等...

Sample.objects.filter(date__year='2011', date__year='2013')
于 2013-10-22T19:21:23.103 回答