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

Python django form.is_valid()始终返回false,python,django,forms,dajaxice,dajax,Python,Django,Forms,Dajaxice,Dajax,在我看来,我的is valid函数似乎总是返回false,即使帖子似乎发送了正确的数据(我认为)。我对django和python非常陌生,我使用django文档作为指导。我还尝试使用dajax中的django表单示例实现我的表单(我已经在同一个项目中成功安装并使用了dajax)。我的其他Dajax方法是get方法,我确信它们不会干扰我的帖子 每次我点击post,就会出现“表单无效”的错误警报,我不知道为什么它没有进入if块 我在这里读过类似的问题,并且仔细检查了我能想到的一切。如果有人能帮我指出

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

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

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

forms.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'

    )
@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()
template.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>
这就是我的帖子的样子

argv    {"form":"Branch=Master&Env=ProdCoursera&Disc=ChemistryMOOC"}

尝试将
{{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 %}
{%for form.fields%}
{{field}}
{%if field.errors%}
{{field.errors}}
{%endif%}
{%endfor%}

查看这是否显示了POST上的一些错误。

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

我将表单替换为选择字段,并通过重写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()]

谢谢你的快速回复。我之前也试过,但我不确定该去哪里寻找错误。但现在我注意到,在发布时,我可以看到在每个select标记中为select元素设置class=“error”。原谅这个幼稚的问题,但这意味着什么?我如何找到问题的根源?原谅这个幼稚的问题,但我应该在哪里寻找这些?如果他们应该出现在网页上的字段旁边/周围,他们不会。除了在firebug中的select标记中添加class=“error”之外,我没有注意到任何变化。哦,我刚刚注意到您的ajax.py文件,并意识到您可能正在自己设置类
dajax.add_css_class('#id_u%s'%error',error')
你能
打印表单。errors
在else子句的某个地方吗?或者将它们作为HTTP响应返回?好建议。我确实将其打印为dajax警报并收到了此消息。
表单是无效的(),您的错误是:
  • Disc
    • 选择一个有效选项。该选项不是可用选项之一。
  • Env
    • 请选择一个有效选项。该选项不是可用选项之一。
  • 分支
    • 选择一个有效选项。该选项不是可用选项之一。

这是因为尽管选择了正确的内容并获得了具有正确参数的帖子,如上所示。您是否认为这是因为它没有实际将表单作为参数发送,而是发送表单元素?您的表单中缺少CSRF标记。