代码之家  ›  专栏  ›  技术社区  ›  Abhinav Nair

django-form.is_valid()始终返回false

  •  2
  • Abhinav Nair  · 技术社区  · 10 年前

    在我看来,我的isvalid函数似乎总是返回false,尽管帖子似乎发送了正确的数据(我认为)。我对django和python很陌生,我正在使用django Docs作为指南。我还尝试使用dajax中的django表单示例来实现我的表单(我已经在同一个项目中成功安装并使用了dajax)。我的其他Dazax方法是get方法,我确信它们不会干扰我的帖子。

    每次我点击post时,都会出现“表单无效”的错误提示,我不知道为什么它没有进入if块。

    我在这里读过类似的问题,并仔细检查了我能想到的一切。如果有人能帮忙指出问题所在,我将不胜感激。我正在下面粘贴所需的代码。

    表格.py

    class BedSelectForm(forms.Form):
    Branch = forms.ModelChoiceField(
        label = u'Branch',
        queryset = Result.objects.values_list('branch', flat =True).distinct(),
        empty_label = 'Not Specified',
        widget = forms.Select(attrs = {'onchange' : "Dajaxice.modmap.updatecomboE(Dajax.process, {'optionB':this.value})"})
        )
    Env = forms.ModelChoiceField(
        label = u'Environment',
        queryset = Result.objects.values_list('environment', flat =True).distinct(),
        empty_label = 'Not Specified',
        widget = forms.Select(attrs = {'onchange' : "Dajaxice.modmap.updatecomboD(Dajax.process, {'optionE':this.value})"})
        )
    Disc = forms.ModelChoiceField(
        label = u'Discipline',
        queryset = Result.objects.values_list('discipline', flat =True).distinct(),
        empty_label = 'Not Specified'
    
        )
    

    模板.html

    <form action="" method="post" id = "select_form">
            <div style = "color :white" class="field_wrapper">
                 {{ form.as_p }}
            </div>        
            <input type="button" value="Display Table" onclick="send_form();"/>
    </form>
    
    <script type="text/javascript">
        function send_form(){
            Dajaxice.modmap.dispTable(Dajax.process,{'form':$('#select_form').serialize(true)});
        }
     </script>
    

    ajax.py公司

    @dajaxice_register
    def dispTable(request, form):
        dajax = Dajax()
        form = BedSelectForm(deserialize_form(form))
    
        if form.is_valid():
            dajax.remove_css_class('#select_form input', 'error')
            dajax.alert("Form is_valid(), your username is: %s" % form.cleaned_data.get('Branch'))
        else:
            dajax.remove_css_class('#select_form input', 'error')
            for error in form.errors:
                dajax.add_css_class('#id_%s' % error, 'error')
            dajax.alert("Form is_notvalid()")
    
        return dajax.json()
    

    这是我的帖子的样子。。

    argv    {"form":"Branch=Master&Env=ProdCoursera&Disc=ChemistryMOOC"}
    
    2 回复  |  直到 10 年前
        1
  •  2
  •   user2867522 user2867522    10 年前

    尝试添加 {{ form.non_field_errors }} 添加到模板。这将显示与字段无关的错误。

    此外,如果可以,为了调试,请执行以下操作,而不是 {{ form.as_p }}

    {% for field in form.fields %}
        <div>{{ field }}</div>
        {% if field.errors %}
                <div class="alert alert-danger">
                    {{ field.errors }}
                </div>
        {% endif %}
    {% endfor %}
    

    看看是否显示了一些错误 POST 惯性导航与制导。

        2
  •  1
  •   Abhinav Nair    10 年前

    我找到了解决问题的办法。我试图使用ModelChoiceField来选取元组,这是一种非常粗糙的方法,因为ModelChoiceField需要模型对象而不是任意字符串。

    我用Choice Fields替换了表单,并通过重写init函数填充它们。以下是我对表格所做的更改,以供参考。我希望这对某人有所帮助!

    class BedSelectForm(forms.Form):
    Branch = forms.ChoiceField(
        choices = [],)
    
    Env = forms.ChoiceField(
        choices = [],)
    
    Disc = forms.ChoiceField(
        choices = [],)
    
    def __init__(self, *args, **kwargs):
        super(BedSelectForm, self).__init__(*args, **kwargs)
        self.fields['Branch'].choices = [(x.pk, x.branch) for x in Result.objects.distinct()]
        self.fields['Env'].choices = [(x.pk, x.environment) for x in Result.objects.distinct()]
        self.fields['Disc'].choices = [(x.pk, x.discipline) for x in Result.objects.distinct()]