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

Django中如何仅禁用对应日期的已预约下拉选择框选项

问题分析

你的代码逻辑错误在于将日期、时段拆成了三个独立的列表,判断条件只是简单的"时段存在于全局预约列表 + 当前年月有预约 + 当前日期有预约",这会导致只要某个时段在任意日期被预约过,且当前日期有任何预约,该时段就会被禁用,完全没关联具体的日期和时段配对关系。

解决方案核心

需要把日期和对应的预约时段绑定存储,比如用字典来记录「某一天对应的所有已预约时段」,这样渲染当天的下拉框时,只需要检查当前时段是否属于该日期的已预约列表即可。

修改后的代码
def formatday(self, day, rdvs):
    select_hour = RdvForm()
    select_dat = Rdv.objects.all().values()

    # 重构数据:用字典存储「日期字符串: 该日期的已预约时段列表」
    date_to_hours = {}
    for rdv in select_dat:
        # 获取完整日期字符串(比如"2025-03-02")
        full_date = str(rdv["select_date"])
        # 获取该预约的时段
        hour = rdv["start_time"]
        # 初始化字典键,不存在则创建空列表
        if full_date not in date_to_hours:
            date_to_hours[full_date] = []
        date_to_hours[full_date].append(hour)

    # 生成当前单元格对应的完整日期字符串
    if day != 0:
        current_full_date = f"{self.year}-{self.month:02d}-{day:02d}"
    else:
        current_full_date = ""

    htm = f'<select name="start_time" id="id_start_time">'
    
    # 获取当前日期对应的已预约时段列表,没有则为空列表
    booked_hours = date_to_hours.get(current_full_date, [])

    for i in range(len(select_hour['start_time'])):
        hour_value = select_hour['start_time'][i].data['value']
        # 只判断当前时段是否在当前日期的已预约列表中
        if hour_value in booked_hours:
            htm += f'<option class="{i}" disabled="disabled" value="{hour_value}">{hour_value}</option>'
        else:
            htm += f'<option value="{hour_value}">{hour_value}</option>'
            
    htm += f'</select>'

    # 渲染单元格
    if day != 0:
        return f"<td><span class='date' style='font-weight:bold'>{day:02d}</span><br> {htm} </td>"
    return '<td></td>'
关键修改点
  • 用date_to_hours字典替代原来三个独立的列表,直接关联日期和对应的预约时段,避免了跨日期的错误匹配。
  • 生成当前单元格的完整日期字符串current_full_date,精准定位到当天的预约数据。
  • 判断条件简化为hour_value in booked_hours,只禁用当前日期下已被预约的时段,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:31:13