Django ModelForm 小部件和标签
Django ModelForm widgets and labels
当我有一个常规的 ModelForm 字段时,设置它的小部件 and/or 标签将如下所示:
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',
}
到目前为止一切正常。但是当涉及到更多 "complicated" 字段时,小部件将忽略它的属性......这让我感到恶心。
示例:
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 = {}
,它将有一个默认值 class 并且标签将是字段的名称("field_z").
如果它不是像上一个这样的 "regular" 字段,我该如何管理小部件和标签?
widgets
和 labels
用于覆盖从模型自动创建的字段的相关属性。但是在 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
中都不起作用 - 相关的小部件是 SelectMultiple
。
当我有一个常规的 ModelForm 字段时,设置它的小部件 and/or 标签将如下所示:
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',
}
到目前为止一切正常。但是当涉及到更多 "complicated" 字段时,小部件将忽略它的属性......这让我感到恶心。
示例:
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 = {}
,它将有一个默认值 class 并且标签将是字段的名称("field_z").
如果它不是像上一个这样的 "regular" 字段,我该如何管理小部件和标签?
widgets
和 labels
用于覆盖从模型自动创建的字段的相关属性。但是在 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
中都不起作用 - 相关的小部件是 SelectMultiple
。