首页 > 解决方案 > ModelChoiceField 小部件属性无效

问题描述

我有这个模型表单,我必须手动渲染,但 ModelChoiceField 属性没有任何效果。

class ExtendedUserForm(forms.ModelForm):
    favourite_provider = forms.ModelChoiceField(queryset=Provider.objects.all())

    class Meta:
        EXPERTISE_CHOICES = (
            ('N', 'Novice'),
            ('B', 'Beginner'),
            ('I', 'Intermediate'),
            ('E', 'Expert'),
        )

        model = ExtendedUser
        labels = {
            'expertise': 'Expertise',
            'favourite_provider': 'Favourite provider',
            'job_title': 'Job title',
            'job_place': 'Company/Institution',
        }

        widgets = {
            'expertise': forms.Select(choices=EXPERTISE_CHOICES, attrs={'class': 'form-control'}),
            'favourite_provider': forms.Select(attrs={'class': 'form-control'}),
            'job_title': forms.TextInput(attrs={'placeholder': 'Your job title', 'class': 'form-control'}),
            'job_place': forms.TextInput(attrs={'placeholder': 'Your company/institution', 'class': 'form-control'}),
        }
        exclude = ['user', 'history', 'favourite_services']

呈现的 HTML 如下:

<div class="form-group">
    <label><label for="id_expertise">Expertise:</label></label>
    <select name="expertise" required id="id_expertise" class="form-control">
      <option value="" selected>---------</option>
      <option value="N">Novice</option> 
      <option value="B">Beginner</option>
      <option value="C">Competent</option>
      <option value="P">Proficient</option>
      <option value="E">Expert</option>
    </select>
  </div>


 <div class="form-group">
 <label><label for="id_favourite_provider">Favourite provider:</label></label>
 <select name="favourite_provider" required id="id_favourite_provider">
      <option value="" selected>---------</option>
      <option value="1">AWS</option>
    </select>

正如你所看到的,第二个选择没有 class 属性,尽管我在这里明确了这一点'favourite_provider': forms.Select(attrs={'class': 'form-control'})。如何解决?

标签: django

解决方案


Django文档引用(来自注释):

以声明方式定义的字段保持原样,因此对 Meta 属性(如小部件、标签、help_texts 或 error_messages)所做的任何自定义都将被忽略;这些仅适用于自动生成的字段。

要获得您想要的,您应该明确填写 ModelChoiceField 的小部件参数:

favourite_provider = forms.ModelChoiceField(queryset=Provider.objects.all(), widget=forms.Select(attrs={'class': 'form-control'}))

推荐阅读