我正在尝试每周建立一个小型活动日历。我的当周从星期一开始到星期日结束
以下是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>
答案 0 :(得分: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>
答案 1 :(得分: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 %}
我没有在一个项目中尝试过这个,但逻辑对我来说似乎很好。希望它有所帮助:)
答案 2 :(得分:0)
只需将其放在以逗号分隔的查询中即可。您可以使用完整日期,日期,月份等...
Sample.objects.filter(date__year='2011', date__year='2013')