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

如何根据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:06:04