Django ModelForm如何仅展示Profile模型中角色为Doctor的选项
解决方案
你可以通过以下两种方式实现doctor字段仅展示医生角色的Profile选项:
方法1:表单层过滤(仅对当前表单生效,灵活性最高)
在表单的__init__方法中重写doctor字段的查询集即可,修改后的表单代码如下:
class AppointmentForm(forms.ModelForm): class Meta: model=Appointment exclude = ['id'] def __init__(self,*args,**kwargs): super().__init__(*args, **kwargs) # 新增该行过滤医生角色,假设Profile模型角色字段为role,医生取值为'Doctor' self.fields['doctor'].queryset = Profile.objects.filter(role='Doctor') self.helper=FormHelper() self.helper.layout=Layout( Row( Column('patient',css_class="form-control, col-md-4 mb-0"), Column('date',css_class="form-group, col-md-4 mb-0"), Column('doctor',css_class="form-group, col-md-4 mb-0"), css_class='row ' ), Submit('btn_save', 'Save',css_class='btn-success') )
你可以根据自己Profile模型实际的角色字段名、角色取值调整filter里的过滤条件。
方法2:模型层全局限制(所有使用该外键的场景都生效)
如果你希望所有调用Appointment.doctor外键的场景(包括Django管理后台、其他自定义表单)都只能选择医生角色的Profile,可以直接修改模型字段定义,新增limit_choices_to参数:
class Appointment(models.Model): patient=models.ForeignKey(Patient,on_delete=models.SET_NULL,null=True) date=models.DateField(default=datetime.date.today) # 新增limit_choices_to参数过滤医生角色 doctor=models.ForeignKey(Profile,on_delete=models.CASCADE, limit_choices_to={'role': 'Doctor'}) status=models.CharField(max_length=12,default="open") def __str__(self): return self.name
内容的提问来源于stack exchange,提问作者Monty Swanson
相关产品推荐
相关产品推荐

