如何使用Django查询和显示特定日期范围的内容?

时间:2013-10-22 18:23:05

标签: django django-models django-templates django-views

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

以下是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>

3 个答案:

答案 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')