【问题标题】:How do I query and display something for a specific date range with Django?如何使用 Django 查询和显示特定日期范围的内容?
【发布时间】:2013-10-31 18:32:15
【问题描述】:

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

这是我的 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>

【问题讨论】:

  • 我不太确定你在问什么。但是您是否希望在某个日期范围内查询事件?
  • @DeepankarBajpeyi 好吧,我的意思是我想从我的模型中看到的“开始”和在我的模型中看到的“结束”获取事件,并将它们分组到当前一周的输出中,如我的代码即:[10 月 21 日 - 咖啡和着色活动] [10 月 22 日 - 瑜伽活动] [10 月 23 日 - 咖啡和着色活动(第 2 天)] [10 月 24 日 - 数学]

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


【解决方案1】:

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

Sample.objects.filter(date__year='2011', date__year='2013')

【讨论】:

  • 如何按上面列出的日期分组?
【解决方案2】:

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

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

        {% endfor %}
        {{ d }}
    {% endfor %}
</div>

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 有趣,这似乎是我正在寻找的解决方案,除了 date_a 和 date_b 是什么?
    • date_a 和 date_b 是您想要事件的选定日期。实际上,如果 events 中事件的 end_date 超出周范围,则此逻辑将失败。但我希望你能明白。我会更新答案
    • 刚刚更新。我知道它不是很pythonic(我在这里重复了很多代码),但这应该可以工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多