【问题标题】:Flask WTF validation False on first submit, True on secondFlask WTF 验证第一次提交时为假,第二次提交时为真
【发布时间】:2017-05-16 09:12:16
【问题描述】:

我在 Flask-wtforms 中使用以下代码。我已经尝试在 SelectField 中使用和不使用各种验证器,但是在用户第一次提交表单验证时返回 false。

我也尝试删除额外的验证方法,但仍然在 SelectField 中留下一个验证器,并且在首次提交时再次验证返回 False。

基本上我想知道 SelectField 是否未设置为值 -1(即已由视图方法填充,并且可能用户对当前活动的项目感到满意)。我不确定为什么表单在第二次提交时有效,即使表单上没有选择其他内容

forms.py

something = SelectField(label = 'Something', choices = [('-1','Select Something')], default=('-1','Select Something'), id='select_something', validators=[validators.DataRequired(message='Nothing selected')])
#NB the line below with no validator also prints "--validate() returned false"
#something = SelectField(label = 'Something', choices = [('-1','Select Something')], default=('-1','Select Something'), id='select_something')
submit = SubmitField('Submit')

def validate(self):
    rv = Form.validate(self)
    if not rv:
        print("--validate() returned false")
        return False

    #the line below never fired, see fix in following line
    #if self.something.data == -1:
    if str(self.something.data) == '-1':
        logger.debug("--validate() data==-1")
        return False
    return True

view.py

form = Something(request.form)
if request.method == 'GET':
    #get tuple_list from database
    ...
    form.something.choices = tuple_list
    form.something.default = tuple_list[0]

if request.method == 'POST' and form.validate():
    print('Something added.')

【问题讨论】:

  • form.errors 说什么?您是否在模板中包含了form.csrf_token 并在配置中设置了SECRET 键?
  • @MrLeeh,谢谢,错误为空,crsf 和 scret_key 设置正常。我发现了几个问题 - 一个与验证方法有关 - 数据从未等于 -1 请参阅修复。也是 request.method == 'GET' 块中的一个问题,我删除了 while 事情并且正在工作。

标签: validation flask flask-wtforms


【解决方案1】:

我在每个选择元组的第一部分使用字符串而不是整数(即应该是 (1, 'text'))并且没有正确设置默认值(只需设置默认值 = n,其中 n = 整数)。

请注意此处的 form.process() 调用:How do you set a default value for a WTForms SelectField?

以下修复:

views.py

form = Something(request.form)
#get tuple_list from database
...
form.something.choices = tuple_list
form.something.default = tuple_list[0][0] #integer id value
form.process() 
if request.method == 'POST' and form.validate():
    return self.render_template('it_works.html')
return self.render_template('select_something.html')

forms.py

#no validator used here
something = SelectField(label = 'Something', choices = [], id='select_something')
submit = SubmitField('Submit')

def validate(self):
    if len(self.something.choices) == 0:
        return False
    return True

【讨论】:

  • 天啊。这才是真正的救命恩人。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-03-17
  • 2015-09-28
  • 2021-04-29
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 2011-03-25
  • 2017-07-28
相关资源
最近更新 更多