如何根据Django关联模型的布尔值过滤ModelForm的可选选项?
实现方案
你可以通过两种常用方式实现仅展示可用状态为True的献血者选项:
方法1:修改Form类(推荐)
直接在DonationForm的初始化方法中过滤donor字段的可选查询集,该方案的优势是所有用到该表单的场景都会自动应用过滤规则,无需重复修改视图代码:
class DonationForm(forms.ModelForm): class Meta: model = Donation fields = ['donor', 'patient', 'amount'] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 仅保留availability为True的献血者作为可选项 self.fields['donor'].queryset = Donor.objects.filter(availability=True)
方法2:在视图中动态修改查询集
如果你不想修改表单类,也可以在视图实例化表单后手动调整donor字段的可选范围,注意GET和POST请求都需要设置,否则POST校验时会报错:
def new_donation(request): if request.method == 'POST': form = DonationForm(request.POST) # POST请求同样需要设置过滤规则,保证表单校验合法 form.fields['donor'].queryset = Donor.objects.filter(availability=True) if form.is_valid(): # 用cleaned_data获取对象比直接取request.POST更安全 donor = form.cleaned_data['donor'] donor.availability = False donor.save() form.save() # 建议替换为你的献血记录列表路由,避免重复提交表单 return redirect('donation_list') else: form = DonationForm() form.fields['donor'].queryset = Donor.objects.filter(availability=True) return render(request, 'new_donation.html', {'form': form})
额外注意点
你当前Donor模型中blood_group字段的默认值为'O_Positive',但你定义的BLOOD_GROUPS选项中对应值为'O+',二者不匹配,建议将默认值修改为default='O+',避免数据保存异常。
内容的提问来源于stack exchange,提问作者i701
相关产品推荐
相关产品推荐

