今天用Flask 表单,form.validate_on_submit()总是false,总算改对了,总结一下看到的解决方法
表单的地方没写{{ form.csrf_token }}
在HTML <form></form>里加上就好
<form class="layui-form" method="post">
{{ form.csrf_token }}
<div class="layui-input-inline">
{{ form.account(class="layui-input",placeholder="账号") }}
</div>
<div class="layui-input-inline">
{{ form.password(class="layui-input",placeholder="密码") }}
</div>
<div class="layui-input-inline login-btn">
{{ form.submit(class="layui-btn") }}
<button lay-submit lay-filter="login" class="layui-btn">登录</button>
</div>
</form>
定义表单时没写validators=[DataRequired()]
account = StringField(u'账号', validators=[DataRequired()])
password = PasswordField(u'密码', validators=[DataRequired()])
submit = SubmitField(u'登录')
如果不写这句,form.validate_on_submit()就认为表单是空的,所以会false
这里注意如果是from flask_wtf import FlaskForm,validators里一定是DataRequired,如果是from flask_wtf import Form 那就是Required
中文编码问题
上面已经写出来了,StringField(u'账号', validators=[DataRequired()]),如果label有中文的话,一定要加Unicode,不然也会false的
补充,SelectField通过不了验证
最近正好又用到flask,下拉列表通过不了,先在HTML页面打印错误信息,
{{ form.like_movie1.errors[0] }}
结果是 'Not a valid choice'
这个没有找到最好的解决方法
原来的代码是
movies = [('0', ''), ('1', u'啊啊'), ('2', u'版本'), ('3', u'猜测'), ('4', u'得到'), ('5', u'呃呃')]
like_movie = SelectField(choices=movies, validators=[DataRequired()], coerce=int)
coerce写的是int,也确实传过来int,但是就是通过不了,改成coerce=str之后就通过验证了。。。
用以下方法打印错误信息,很管用
{{ form.errors }}
还有一点,前端form标签里一定要写method="post"
<form method="post">,泪的教训啊
————————————————
版权声明:本文为CSDN博主「six66667」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/six66667/article/details/85885583