django form.is_valid() 总是返回假

2 投票
2 回答
1607 浏览
提问于 2025-04-18 13:28

我在我的视图中使用的有效函数总是返回假,即使我觉得发送的数据是正确的(我认为)。我对django和python还很陌生,正在参考Django文档作为指南。我还在尝试使用dajax中的django表单示例来实现我的表单(我已经在同一个项目中成功安装并使用了dajax)。我其他的Dajax方法是获取方法,我确定它们不会干扰我的提交。

每次我点击提交时,我设置的“表单无效”错误提示都会出现,我不明白为什么它不进入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'

    )

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>

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 个回答

2

试着在你的模板里加上 {{ 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 提交的时候有没有显示出错误。

1

我找到了我的问题的解决办法。我之前试图用一个叫做ModelChoiceField的东西来选择元组,这其实是一种很不靠谱的方法,因为ModelChoiceField是用来处理模型对象的,而不是随便的字符串。

我把我的表单换成了Choice Fields,并通过重写初始化函数来填充它们。下面是我对表单所做的修改,供大家参考。希望这能帮到某些人!

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()]

撰写回答