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
相关产品推荐
相关产品推荐

