Django forms.FloatField和IntegerField接受文本输入而没有验证错误

时间:2016-03-29 15:43:05

标签: django django-forms

我有一个要求FloatField和IntegerField的表单。

conc = forms.FloatField(label='Concentration (uM)',required=False)
muxlevel = forms.IntegerField(label='Multiplex level ',required=False)

如果用户输入说0.5,进入muxlevel字段,form.is_valid()返回False,并返回表单

“输入整数。”

这是我的期望(实际上它很棒)。但是如果用户在任一字段中输入文本,例如'asdf',则验证不会抱怨,form.is_valid()返回True,而form.cleaned_data ['muxlevel']的值为None。将文本输入FloatField conc。

也会发生同样的事情

这不是我所期望的,我宁愿用户返回到“输入整数”或“输入浮点值”的表格。

我已经搜索过,并没有看到报告此问题。实际上文档说明了......

  • 规范化为:Python float
  • 验证给定值是否为浮动
  • 允许使用前导和尾随空格,如Python的float()函数。

编辑 - 视图看起来像

from .forms import *
def scr_query(request):
    summ = ''
    if request.method == "POST":
        form = QueryForm(request.POST)

        if form.is_valid():

            if (form.cleaned_data['conc']):         
                summ += "Concentration < " + str(form.cleaned_data['conc_upper']) + "<br>"
            if (form.cleaned_data['muxlevel']):

                summ += "Muxlevel > " + str(form.cleaned_data['muxlevel']) + "<br>"

,表格看起来像这样

class QueryForm(forms.Form):

    conc = forms.FloatField(label='Concentration (uM)',required=False)
    muxlevel = forms.IntegerField(label='Multiplex level ',required=False)

我的阅读告诉我,实际调用python的float()来检查提供的字符串是否可以强制转换为float。如果我使用float('abc')在控制台上执行此操作,我会得到预期的异常。所以不确定为什么它会转换为无。在调用float()之前是否存在某种形式的文本剥离,因此它得到一个空值,而float('')返回None,如预期的那样?

非常感谢任何协助。

感谢。

1 个答案:

答案 0 :(得分:1)

正如@Alasdair所说,问题出在request.POST上。它不包含字段数据。但原因是小部件。默认情况下,Django使用forms.NumberInput(取决于你的本地化设置),它可以防止在请求中发送非数字数据。因此,如果您更改为muxlevel = forms.IntegerField(label='Multiplex level ',required=False, widget=forms.TextInput()),您将看到正确的错误消息。