我有以下Django表格:
label = forms.CharField(label="Label",
min_length=2,
max_length=100,
required=True,
widget=forms.TextInput(attrs={'class': 'form-control input-sm'}))
hour = forms.ChoiceField(label="Hour",
choices=choice_hour,
required=True,
widget=forms.Select(attrs={'class': 'form-control input-sm'}))
minute = forms.ChoiceField(label="Minute",
choices=choice_minute,
required=True,
widget=forms.Select(attrs={'class': 'form-control input-sm'}))
period = forms.MultipleChoiceField(label="Day of week",
choices=choice_period,
required=True,
error_messages={'required': 'At least you must select one day'},
widget=forms.CheckboxSelectMultiple(renderer=HorizontalCheckboxRenderer))
snooze = forms.ChoiceField(label="Auto stop",
choices=choice_snooze,
required=True,
widget=forms.Select(attrs={'class': 'form-control input-sm'}))
mode = forms.ChoiceField(label="Mode",
choices=choice_mode,
required=True,
widget=forms.Select(attrs={'class': 'form-control input-sm'}))
if mode == 'music':
webradio = forms.ModelChoiceField(queryset=Webradio.objects.all(),
widget=forms.Select(attrs={'class': 'form-control input-sm'}), required=False)
else:
webradio = forms.ModelChoiceField(queryset=Webradio.objects.all(),
widget=forms.Select(attrs={'class': 'form-control input-sm'}), required=True)
class Meta:
model = Alarmclock
fields = ['label', 'hour', 'minute', 'period', 'snooze', 'mode', 'webradio']“模式”字段表单允许知道用户是否需要“收音机”或“音乐”。
当模式是‘音乐’,网络无线电字段可以是空的。但是当模式是“收音机”时,必须设置网络无线电字段。
如何根据模式更新网络无线电字段表单?
我尝试了一个IF条件,但我认为模式变量是找不到的,网络无线电场是所有所需的时间。
谢谢。
发布于 2015-05-08 19:39:09
将webradio字段定义为非必需字段,然后在clean方法中进行验证( clean的目的是对相互依赖的字段进行验证)。
class Form(forms.ModelForm):
# other fields ...
mode = forms.ChoiceField(
label="Mode", choices=choice_mode, required=True,
widget=forms.Select(attrs={'class': 'form-control input-sm'})
)
webradio = forms.ModelChoiceField(
queryset=Webradio.objects.all(),
widget=forms.Select(attrs={'class': 'form-control input-sm'}),
required=False
)
class Meta:
model = Alarmclock
fields = ['label', 'hour', 'minute', 'period', 'snooze', 'mode', 'webradio']
def clean(self):
mode = self.cleaned_data.get('mode')
if mode == 'music':
webradio = self.cleaned_data.get('webradio')
if not webradio:
raise forms.ValidationError({'webradio': 'Webradio field is required.'})有关更多细节,请访问医生们。
请注意,此方法在Django 1.7中已更改:
在先前版本的Django中,需要form.clean()返回一个cleaned_data字典。此方法可能仍然返回要使用的数据字典,但不再需要它。
发布于 2015-05-08 17:23:06
我想这应该能起作用。
class FormName(forms.ModelForm):
label = forms.CharField(label="Label",
min_length=2,
max_length=100,
required=True,
widget=forms.TextInput(attrs={'class': 'form-control input-sm'}))
hour = forms.ChoiceField(label="Hour",
choices=choice_hour,
required=True,
widget=forms.Select(attrs={'class': 'form-control input-sm'}))
minute = forms.ChoiceField(label="Minute",
choices=choice_minute,
required=True,
widget=forms.Select(attrs={'class': 'form-control input-sm'}))
period = forms.MultipleChoiceField(label="Day of week",
choices=choice_period,
required=True,
error_messages={'required': 'At least you must select one day'},
widget=forms.CheckboxSelectMultiple(renderer=HorizontalCheckboxRenderer))
snooze = forms.ChoiceField(label="Auto stop",
choices=choice_snooze,
required=True,
widget=forms.Select(attrs={'class': 'form-control input-sm'}))
mode = forms.ChoiceField(label="Mode",
choices=choice_mode,
required=True,
widget=forms.Select(attrs={'class': 'form-control input-sm'}))
webradio = forms.ModelChoiceField(queryset=Webradio.objects.all(),
widget=forms.Select(attrs={'class': 'form-control input-sm'}), required=True)
class Meta:
model = Alarmclock
fields = ['label', 'hour', 'minute', 'period', 'snooze', 'mode', 'webradio']
def clean_mode(self):
mode = self.cleaned_data.get('mode')
if mode == 'music':
self.fields['webradio'].required = False
return super(FormName,self).clean_mode()它所做的基本上是改变所需的属性的网络无线电场在走,取决于价值的模式。
https://stackoverflow.com/questions/30129178
复制相似问题