Django表单提交后修改关联模型Boolean字段的实现方案咨询
解决Django表单保存时修改关联ForeignKey模型字段的问题
问题原因
你之前尝试的form.booked_time.status = False无效,是因为form是BookingForm(ModelForm)的实例,并非Bookings模型对象,无法直接通过它访问关联的AvailableHours实例。
基础解决方案
修改视图代码,从表单处理后的Bookings实例中获取关联的AvailableHours对象,修改其status字段并保存:
@login_required() def booking_form(request): form = forms.BookingForm() if request.method == 'POST': form = forms.BookingForm(request.POST) if form.is_valid(): book = form.save(commit=False) book.user = request.user book.save() # 获取关联的可用时间段实例 available_hour = book.booked_time # 将状态改为不可用 available_hour.status = False available_hour.save() return HttpResponseRedirect(reverse('creator:login')) return render(request, 'account/book.html', {'form': form})
优化方案(避免并发重复预订)
如果系统存在多用户同时预订的场景,建议添加数据库事务和行锁,彻底防止同一时间段被重复预订:
from django.db import transaction @login_required() def booking_form(request): form = forms.BookingForm() if request.method == 'POST': form = forms.BookingForm(request.POST) if form.is_valid(): hour_id = form.cleaned_data['booked_time'].id # 开启事务并锁定目标时间段记录 with transaction.atomic(): # 锁行操作,防止并发修改 available_hour = AvailableHours.objects.select_for_update().get(id=hour_id) # 提前检查状态,避免无效操作 if not available_hour.status: form.add_error('booked_time', '该时间段已被预订') return render(request, 'account/book.html', {'form': form}) # 保存预订记录 book = form.save(commit=False) book.user = request.user book.save() # 修改并保存时间段状态 available_hour.status = False available_hour.save() return HttpResponseRedirect(reverse('creator:login')) return render(request, 'account/book.html', {'form': form})
内容的提问来源于stack exchange,提问作者Essiprog
相关产品推荐
相关产品推荐

