Django根据另一个字段表单更新表单

时间:2015-05-08 17:02:39

标签: django forms field

我有以下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']

“模式”字段允许用户知道用户是想要“广播”还是“音乐”。

当Mode为'music'时,webradio字段可以为空。 但是当Mode是'radio'时,必须设置webradio字段。

如何根据模式更新webradio字段表单?

我尝试使用IF条件,但我认为找不到模式变量,webradio字段是所有必需的时间。

感谢。

2 个答案:

答案 0 :(得分:1)

将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.'})

查看the docs了解详情。

请注意,此方法在Django 1.7中已更改:

  

在以前的Django版本中,需要使用form.clean()来返回cleaning_data的字典。此方法可能仍会返回要使用的数据字典,但不再需要它。

答案 1 :(得分:0)

我想这应该可以解决问题。

MPI_Barrier

它的作用基本上是随时改变webradio字段的必需属性,具体取决于模式的值。