【问题标题】:django form.is_valid() always returns falsedjango form.is_valid() 总是返回 false
【发布时间】:2014-09-06 05:08:47
【问题描述】:

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

每次我发帖时,我都会显示“表单无效”错误警报,我不确定为什么它没有进入 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"}

【问题讨论】:

  • 您的表单中缺少 CSRF 令牌。

标签: python django forms dajaxice dajax


【解决方案1】:

我找到了解决问题的方法。我试图使用 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()]

【讨论】:

    【解决方案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 %}
    

    查看POSTing 上是否显示一些错误。

    【讨论】:

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

      尽管选择正确并使用正确的参数获取帖子,如上所示。跨度>
    • 你认为这是因为它实际上不是将表单作为参数发送,而是发送表单元素?
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 2018-01-05
    • 1970-01-01
    • 2020-04-06
    • 2014-01-10
    • 2020-05-09
    相关资源
    最近更新 更多