Django ModelForm小部件和标签

时间:2019-02-18 13:15:42

标签: python django modelform

当我有一个常规的ModelForm字段时,设置其小部件和/或标签将如下所示:

class MyModelForm(models.ModelForm):
    class Meta:
        model = MyModel
        fields = ['field_x', 'field_y']
        widgets = {
            'field_x': Forms.TextInput(attrs={'class': 'myclass', 'readonly': 'readonly'}),
            'field_y': Forms.Select(attrs{'class': 'myclass'}),
        }
        labels = {
            'field_x': 'Input your X value here',
            'field_y': 'Select your Y value here',
        }

到目前为止还可以。但是,当涉及更多“复杂”字段时,小部件将忽略其属性……这让我感到恶心。

示例:

class MyComplicatedModelForm(forms.ModelForm):
    field_z = forms.ModelChoiceField(queryset=AnyClass.objects.all(), empty_label=None, required=True, to_field_name='id')

    class Meta:
        model = MyComplicatedModel
        fields = ['field_z']
        widgets = {
                'field_z': Forms.ModelChoiceField(attrs={'class': 'myclass'}),
        }
        labels = {
                'field_z': 'Select your Z value here',
        }

它将正常运行,但是将忽略其widgets = {}labels = {},它将具有默认类,并且标签将是字段的名称(“ field_z”)。 当它不是最后一个这样的“常规”字段时,如何管理小部件和标签?

1 个答案:

答案 0 :(得分:1)

widgetslabels用于覆盖从模型自动创建的字段的相关属性。但是对于field_z来说,它不是自动创建的;您专门提供了一个定义。因此,您需要直接在该定义中设置相关属性:

class MyComplicatedModelForm(forms.ModelForm):
    field_z = forms.ModelChoiceField(
        queryset=AnyClass.objects.all(),
        empty_label=None,
        required=True,
        to_field_name='id',
        label='Select your Z value here',
        widget=forms.SelectMultiple(attrs={'class': 'myclass'})
    )

    class Meta:
        model = MyComplicatedModel
        fields = ['field_z']

请注意,ModelChoiceField是一个字段,而不是窗口小部件,因此无论如何都无法在widgets中使用-相关的窗口小部件是stackblitz