首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django根据另一个字段表单更新表单

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

Stack Overflow用户
提问于 2015-05-08 17:02:38
回答 2查看 3.7K关注 0票数 3

我有以下Django表格:

代码语言:javascript
复制
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条件,但我认为模式变量是找不到的,网络无线电场是所有所需的时间。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-08 19:39:09

将webradio字段定义为非必需字段,然后在clean方法中进行验证( clean的目的是对相互依赖的字段进行验证)。

代码语言:javascript
复制
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字典。此方法可能仍然返回要使用的数据字典,但不再需要它。

票数 1
EN

Stack Overflow用户

发布于 2015-05-08 17:23:06

我想这应该能起作用。

代码语言:javascript
复制
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()

它所做的基本上是改变所需的属性的网络无线电场在走,取决于价值的模式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30129178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档