转:Flask 表单form.validate_on_submit()总是false的解决方法


今天用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章