轉: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

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