【问题标题】:Number Validation Between Range 0 and 100范围 0 到 100 之间的数字验证
【发布时间】:2015-12-22 19:08:57
【问题描述】:

我目前的 WTForms Number 验证器代码如下:

class ScoreForm(Form):
    score = FloatField(validators=[DataRequired(), NumberRange(0,100)])
    submit = SubmitField()

我希望将分数指定在 0 到 100 之间(包括两者和允许的小数)。

上面的代码有两个问题:

  1. 它不允许我输入 0 作为值。这样做会吐出内置的错误消息

    [This field is required.]

  2. 如果我在字段中输入一些字符串,我会收到与上面相同的错误消息,这不是正确的消息。

如何纠正这两个问题?

【问题讨论】:

  • 我自己没有尝试过,但最近here 读到,在大多数情况下,DecimalField 比 FloatField 更可取,除了一些需要 IEEE 的罕见情况。试试这个用于 DecimalField 的 NumberRange 验证器,也许这对你有用
  • 我正在使用 pyMongo,因为它没有对 Decimal 的原生支持,如果我使用 DecimalField,它会带来很多不必要的问题。还是谢谢

标签: python wtforms flask-wtforms


【解决方案1】:

问题不在于 NumberRange 验证器,而在于 DataRequired 验证器。见:

https://stackoverflow.com/a/25335781/1194335

TL;DR:DataRequired 将 0 评估为错误,您需要改用 InputRequired 验证器!

【讨论】:

    【解决方案2】:

    在FloatField 和DecimalField 发生了很多奇怪的行为之后,我终于使用了StringField 并为我的上述用例编写了一个自定义验证器,如下所示:

    class ScoreForm(Form):
        score = StringField(validators=[DataRequired()])
        add_score = SubmitField()
    
        def __init__(self):
            Form.__init__(self)
    
        def validate(self):
            if not Form.validate(self):
                return False
            try:
                float(self.score.data)
            except ValueError:
                self.score.errors.append(
                    'Score must be a valid number')
                return False
            if 0 > float(self.score.data) > 100:
                self.score.errors.append(
                    'Score must be in the range 0-100')
                return False
            return True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-12
      • 2016-09-21
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      相关资源
      最近更新 更多