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

Django 如何查询并在模板中展示未被预约的空闲日期

可以实现,你现有代码只需要调整判断逻辑即可。

问题核心原因

你现有代码的逻辑错误在于,循环判断条件写错了:你判断的是new_date not in not_found_dates,这会把范围内所有日期都加进去,完全没有和已预约的日期做比对,所以拿不到未预约的结果。

修正实现步骤

  1. 先把查询到的已预约日期统一转成date类型、去重后存入集合,提升比对效率
  2. 遍历日期范围时,判断当前日期不在已预约集合中,才加入未预约日期列表

修正后的代码

import datetime
from .models import Appointment

# 先确定查询的起止日期
start_date = datetime.date.today()
end_date = start_date + datetime.timedelta(days=5)

# 提取已预约的日期(如果start_appointment是datetime类型,要转成date再去重,避免类型不匹配导致比对失败)
booked_dates = set()
for apt in Appointment.objects.filter(start_appointment__range=(start_date, end_date)):
    booked_date = apt.start_appointment.date() if isinstance(apt.start_appointment, datetime.datetime) else apt.start_appointment
    booked_dates.add(booked_date)

# 遍历日期范围,筛选未预约的日期
not_found_dates = []
for n in range(int((end_date - start_date).days)):
    current_date = start_date + datetime.timedelta(days=n)
    if current_date not in booked_dates:
        not_found_dates.append(current_date)

# 原有的预约记录查询逻辑保留
examples = Appointment.objects.filter(start_appointment__range=(start_date, end_date)).values('start_appointment')

return render(request, 'appointments/add-appointment.html', {'examples': examples, 'not_found_dates': not_found_dates})

模板渲染说明

你在模板中直接遍历not_found_dates即可输出所有未被预约的日期,按你给出的测试数据,最终输出的就是你需要的2021-11-24、2021-11-25、2021-11-26三个日期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:54:01