在 wtforms 中打印 form.validate_on_submit() 时我得到 False 并且我也设置了密钥

Posted

技术标签:

【中文标题】在 wtforms 中打印 form.validate_on_submit() 时我得到 False 并且我也设置了密钥【英文标题】:I am getting False when print form.validate_on_submit() in wtforms and i set secret key also 【发布时间】:2022-01-22 21:36:31 【问题描述】:

当我在 login.html 中输入电子邮件并单击提交时,我无法打印他们输入的内容,我得到 form.validate_on_submit = False 请帮我解决我的问题。

这是我的 main.py 文件

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired


app = Flask(__name__)

app.config['SECRET_KEY'] = "hi this key is secret"


class LoginForm(FlaskForm):
    email = StringField(label="Email", validators=[DataRequired()])
    submit = SubmitField(label="Submit")


@app.route("/")
def home():
    return render_template('index.html')


@app.route("/login", methods=["GET", "POST"])
def login():
    form = LoginForm(app.secret_key)
    email = None
    print(form.validate_on_submit())
    if form.validate_on_submit():
        print(form.validate_on_submit())
        email = form.email.data
        form.email.data = ""
    else:
        print("form not submitted")
    return render_template("login.html", form=form, email=email)


if __name__ == '__main__':
    app.run(debug=True)

Jinja 模板 (index.html)

<!DOCTYPE HTML>

<html>
    <head>
        <title>Login</title>
    </head>
    <body>
        <div class="container">
            % if email %
            <h1>Your Email Is</h1>
            <h3> email </h3>
            % else %
                <h1>Login</h1>
                <form method="post" action=" url_for("login") ">
                     form.hidden_tag() 
                     form.email.label   form.email(size=20) 
                     form.submit() 
                </form>
            % endif %
        </div>
    </body>
</html>

提前致谢

【问题讨论】:

您看不到已输入的内容,因为目前您不打印它。在您的代码中添加这一行:print(form.email.data) 当我在 if validate_on_submit 之后添加它时,它不会打印,因为 validate_on_submit 是 False,如果我在 if 语句之前添加它,那么表格还没有填写,这就是问题@Tobin 我在您的代码中看到的另一个问题是您有 2 个模板 index.htmllogin.html。您使用模板login.html 呈现表单,但管理表单的所有逻辑都在模板index.html 中。您应该将此代码移动到 login.html 文件中,以便 Flask 验证您的表单。 login 函数中,您只是提供密钥,而不是用户输入的数据。所以,尝试使用form = LoginForm(request.form)。并且不需要使用form.email.data = "" 是的,它有效@KalyanThankyou 【参考方案1】:

我找对了方法 main.py 文件

from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from flask_wtf.csrf import CsrfProtect
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired


app = Flask(__name__)
app.config['SECRET_KEY'] = "hi this key is secret"
csrf = CsrfProtect(app)


class LoginForm(FlaskForm):
    email = StringField(label="Email", validators=[DataRequired()])
    password = PasswordField(label="Password", validators=[DataRequired()])
    submit = SubmitField(label="Submit")


@app.route("/")
def home():
    return render_template('index.html')


@app.route("/login", methods=["GET", "POST"])
def login():
    form = LoginForm(formdata=request.form)
    if form.validate_on_submit():
        email = form.email.data
        password = form.password.data
    return render_template("login.html", form=form)


if __name__ == '__main__':
    app.run(debug=True)

神社模板

<!DOCTYPE HTML>

<html>
    <head>
        <title>Login</title>
    </head>
    <body>
        <div class="container">
            <h1>Login</h1>
            <form method="post" action=" url_for('login') " novalidate>
                 form.csrf_token 
                <p>
                 form.email.label  <br> form.email(size=20) 
                    % for err in form.email.errors %
                    <span style="color: red"> err </span>
                    % endfor %
                </p>
                <p>
                 form.password.label <br>  form.password(size=20) 
                    % for err in form.password.errors %
                    <span style="color: red"> err </span>
                    % endfor %
                </p>
                 form.submit() 
            </form>
        </div>
    </body>
</html>

这个对我有用,希望对每个人都有用

【讨论】:

以上是关于在 wtforms 中打印 form.validate_on_submit() 时我得到 False 并且我也设置了密钥的主要内容,如果未能解决你的问题,请参考以下文章

使用flask和WTForms在一个页面中的多个表单

WTForms In Flask(WTForms在Flask中的应用)

Flask WTForm表单编程

不是动态选择字段 WTFORMS 的有效选择

WTForms-如何预填充文本区域字段?

使用来自 SQLAlchemy 对象的数据在烧瓶中预填充 WTforms