You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django辩论社网站如何从Event模型分离过往与未来活动

Django 按活动时间筛选过往/未来活动实现方案

核心实现思路

借助Django ORM的字段比较查询,以活动举办时间date_of_event和当前系统时间的大小关系为判断依据,拆分两个独立查询集即可。注意要使用Django自带的时区工具获取当前时间,避免时区不匹配导致的查询错误。


具体代码修改

1. 修改视图层查询逻辑

替换原有views.py中直接查询全部活动的逻辑,拆分两个过滤后的查询集传入模板:

from django.shortcuts import render
from django.utils import timezone  # 导入Django时区工具
from .models import Event


def events(request):
    current_time = timezone.now()  # 获取当前带时区的系统时间
    # 筛选过往活动:举办时间早于当前时间,按举办时间倒序(刚结束的排最前)
    past_events = Event.objects.filter(date_of_event__lt=current_time).order_by('-date_of_event')
    # 筛选未来活动:举办时间晚于/等于当前时间,按举办时间升序(最近举办的排最前)
    upcoming_events = Event.objects.filter(date_of_event__gte=current_time).order_by('date_of_event')
    
    context = {
        'title': 'Events',
        'past_events': past_events,
        'upcoming_events': upcoming_events
    }
    return render(request, 'main/Events.html', context)

关键注意点

  • 禁止直接使用Python原生datetime.datetime.now()获取时间:Django默认开启时区支持(配置项USE_TZ = True),原生时间不带时区信息,会导致查询结果偏差、抛出时区警告,必须使用django.utils.timezone.now()。
  • 查询规则说明:field__lt是Django ORM提供的字段查询语法,对应SQL中的<(小于)判断;field__gte对应>=(大于等于)判断。
  • 排序规则可按需调整:上述示例的排序是校园活动站点的通用展示逻辑,你可以根据自身需求修改order_by内的字段。

2. 模板层渲染调整

在main/Events.html模板中,分两个板块遍历两类活动数据即可,参考示例:

<!-- 即将举办的活动板块 -->
<section>
  <h2>即将举办</h2>
  {% for event in upcoming_events %}
  <div class="event-card">
    <img src="{{ event.banner_image.url }}" alt="{{ event.event_name }}">
    <h3>{{ event.event_name }}</h3>
    <p>主办方:{{ event.organiser_of_event.organiser_name }}</p>
    <p>赛制:{{ event.format_of_event.format_name }}</p>
    <p>举办时间:{{ event.date_of_event|date:"Y年m月d日 H:i" }}</p>
    <p>报名费:{{ event.registration_fees }} 元</p>
    {% if event.details %}<p>{{ event.details }}</p>{% endif %}
  </div>
  {% empty %}
  <p>近期暂无待举办活动</p>
  {% endfor %}
</section>

<!-- 过往活动板块 -->
<section>
  <h2>往期回顾</h2>
  {% for event in past_events %}
  <div class="event-card past">
    <img src="{{ event.banner_image.url }}" alt="{{ event.event_name }}">
    <h3>{{ event.event_name }}</h3>
    <p>举办时间:{{ event.date_of_event|date:"Y年m月d日" }}</p>
  </div>
  {% empty %}
  <p>暂无过往活动记录</p>
  {% endfor %}
</section>

可选优化(多场景复用推荐)

如果站点多个视图/位置都需要调用过往/未来活动列表,可以给Event模型加自定义管理器,避免重复写过滤逻辑:

  1. 修改models.py,新增自定义管理器类并绑定到Event模型:
from django.db import models
from django.utils import timezone

# 新增自定义活动管理器
class EventManager(models.Manager):
    def past(self):
        return self.filter(date_of_event__lt=timezone.now()).order_by('-date_of_event')
    
    def upcoming(self):
        return self.filter(date_of_event__gte=timezone.now()).order_by('date_of_event')


class Format(models.Model):
    format_name = models.CharField(max_length=100, null=False, unique=True)

    def __str__(self):
        return self.format_name


class Organiser(models.Model):
    organiser_name = models.CharField(max_length=140, null=False, unique=True)

    def __str__(self):
        return self.organiser_name


class Event(models.Model):
    banner_image = models.ImageField(upload_to="events")
    event_name = models.CharField(max_length=150, null=False)
    organiser_of_event = models.ForeignKey(Organiser, on_delete=models.CASCADE)
    format_of_event = models.ForeignKey(Format, on_delete=models.CASCADE)
    date_of_event = models.DateTimeField(auto_now_add=False)
    registration_fees = models.IntegerField(default=0, help_text="Enter Registration Fees For The Event in Rupees")
    details = models.TextField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    # 绑定自定义管理器,替换默认objects
    objects = EventManager()

    def __str__(self):
        return self.event_name
  1. 绑定后所有位置都可以直接调用方法拿对应数据,视图代码可以简化为:
def events(request):
    context = {
        'title': 'Events',
        'past_events': Event.objects.past(),
        'upcoming_events': Event.objects.upcoming()
    }
    return render(request, 'main/Events.html', context)

内容的提问来源于stack exchange,提问作者Kushagra Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:21:32