为什么这个django形式没有使用来自view.py的初始argrument返回值?

时间:2018-02-05 03:42:03

标签: django

我有一张表格:

class ConfigNotifyForm(forms.Form):
    sensor_name = forms.ChoiceField(widget=forms.Select(),
                        label="Sensor", 
                        choices=[],
                        required=True)
    value_min = forms.FloatField(label="Value Min", required=True)
    value_max = forms.FloatField(label="Value Max", required=True)

    def __init__(self, *args, **kwargs):
        super(ConfigNotifyForm, self).__init__(*args, **kwargs)
        # Get 'initial' argument if any
        initial_arguments = kwargs.get('initial', None)
        sensor_choices = ''
        if initial_arguments != None:
            #for choice in initial_arguments.get('src_choices'):
            sensor_choices = tuple(initial_arguments.get('src_choices'))

        self.fields['sensor_name'].choices = sensor_choices

它可以正常使用模板。但是在提交时,sensor_name不在除了value_min和value_max之外的cleandata中。所以,它没有传递form.is_valid。

但是,如果我像这样编码 init

def __init__(self, *args, **kwargs):
    super(ConfigNotifyForm, self).__init__(*args, **kwargs)
    sensor_choices = (
        ('', 'Select'), 
        ('a0', 'Ndo'), 
        ('a1', 'pH'), 
        ('a2', 'DO'))
    self.fields['sensor_name'].choices = sensor_choices

没关系。表格有效。我不知道为什么。任何人都可以帮我解释和解决这个问题吗?感谢

1 个答案:

答案 0 :(得分:0)

问题在于,您在表单ConfigNotifyForm中提到sensor_namerequired=True。这意味着这个领域不可能是什么。您必须向其传递值才能使表单有效。当您在__init__中对选项进行硬编码时,该字段不再是空/无效,因此它变为有效。