Django使用forms.py时外键字段form-control类不生效如何修改样式
问题根源
你遇到的问题有两个核心原因:
- 模板中没有使用表单类渲染doctor字段:你在模板里手动写了
<select name="doctor_choice">标签,没有调用{{ form.doctor }},所以你在表单类里给doctor字段设置的form-control类根本不会作用到你手写的select标签上。 - 表单类中doctor字段的查询集配置错误:你的Patient模型中doctor字段关联的是User表,但你在PatientForm里给doctor字段设置的queryset是
Patient.objects.all(),查询的是患者表数据,逻辑完全错误。
解决方案
- 第一步:修正表单类的doctor字段配置
把PatientForm里的doctor字段的queryset改为关联User表的查询集:
# 原错误代码 # doctor = forms.ModelChoiceField(widget=forms.Select(attrs={'class': 'form-control'}),queryset=Patient.objects.all()) # 修正后 doctor = forms.ModelChoiceField( widget=forms.Select(attrs={'class': 'form-control'}), queryset=User.objects.all() # 若需过滤仅展示有医生权限的用户,可自行添加过滤条件 )
- 第二步:修改模板代码,替换手动写的doctor选择框
把模板里手动编写的doctor选择块:
<div class="input-group"> <span class="input-group-text">Docteur</span> <select name="doctor_choice"> {% for doctor in doctors %} <option value="{{doctor.pk}}">{{doctor.first_name}} {{doctor.last_name}}</option> {% endfor %} </select> </div>
替换为表单类自动渲染的代码:
<div class="input-group"> <span class="input-group-text">Docteur</span> {{ form.doctor }} </div>
修改后不需要再给模板传doctors变量,表单类会自动加载你配置的queryset里的选项,同时你配置的form-control类也会自动生效。
- 可选优化:统一给所有表单字段加class,避免重复代码
你可以直接在表单的__init__方法里统一给所有字段的widget加form-control类,不需要每个字段单独配置,代码更简洁:
def __init__(self, *args, **kwargs): super(PatientForm, self).__init__(*args, **kwargs) self.fields['birth_date'].input_formats = ('%Y-%m-%d',) # 统一给所有字段添加form-control类 for field_name, field in self.fields.items(): field.widget.attrs['class'] = 'form-control'
内容的提问来源于stack exchange,提问作者Akram Baklouti
相关产品推荐
相关产品推荐

