Django:如何在ModelForm的ModelChoiceField实现显用户名存医生ID
解决方案
问题核心是你误用了User模型的queryset并使用values()返回了字典集合,而ModelChoiceField需要接收模型实例的queryset。同时,你的需求是最终提交doctor表的ID,所以应该直接基于Doctor模型构建字段,通过自定义标签显示关联的User用户名即可。
修改后的代码
from django import forms from .models import patient, doctor, hospitalAdmin from django.contrib.auth.models import User class PatientForm(forms.ModelForm): # 直接关联Doctor模型,因为最终要存储的是doctor的ID assigned_doctor = forms.ModelChoiceField( queryset=None, empty_label="Name of the Doctors", # 不需要to_field_name,默认提交doctor的pk(id) ) class Meta: model = patient fields = ['patient_first_name', 'patient_last_name', 'address', 'mobile', 'age', 'symptoms'] def __init__(self, *args, **kwargs): self.request = kwargs.pop("request") super().__init__(*args, **kwargs) # 优化admin实例获取,避免索引越界错误 admin = hospitalAdmin.objects.filter(user_id=self.request.user.id).first() if admin: # 直接获取当前admin下属的有效医生(关联User状态为True) doctors_queryset = doctor.objects.filter( assigned_hospitalAdmin=admin.pk, user__status=True # 通过外键直接过滤User状态 ) # 给字段赋值合法的模型实例queryset self.fields['assigned_doctor'].queryset = doctors_queryset # 自定义下拉选项显示文本为关联User的username self.fields['assigned_doctor'].label_from_instance = lambda obj: obj.user.username
关键说明
- 字段模型关联调整:
assigned_doctor直接绑定Doctor模型,匹配patient表的doctor_assignid外键,表单提交时自动传递Doctor的ID,无需额外转换。 - 简化查询逻辑:通过外键关联直接过滤,避免手动拼接ID列表的冗余操作,查询效率更高。
- 自定义显示文本:利用
label_from_instance方法,让下拉选项展示医生对应的User用户名,同时提交的是Doctor的ID,完全符合需求。 - 容错处理:用
first()获取admin实例,避免原代码中adminId[0]['pk']可能出现的索引越界问题(当admin不存在时)。
内容的提问来源于stack exchange,提问作者Pe be
相关产品推荐
相关产品推荐

