【问题标题】:Field validation in WTF Forms Flask, redirect methodWTF Forms Flask中的字段验证,重定向方法
【发布时间】:2019-03-12 08:43:51
【问题描述】:

我正在尝试创建我的第一个 Flask Web 应用程序并发现以下问题,我有两个页面,第一页应该获取玩家姓名并将名称提供给下一页,但不幸的是,由于某些原因,名称验证不起作用原因,我可以将必填字段保留为空,然后使用空名称字段转到下一页。

烧瓶代码:

class ChooseName(FlaskForm):
    first_player_name = StringField("Choose first player name: ", [DataRequired()])
    second_player_name = StringField("Choose second player name: ", [DataRequired()])
    button = SubmitField("Confirm")


@app.route('/')
def index():
    form = ChooseName()
    if form.validate_on_submit():
        return redirect(url_for('mega'))
    return render_template('TIC_TAC_TOE_index.html', form=form) 


@app.route('/game_page', methods=["GET", "POST"])
def mega():
    player1 = request.args.get('first_player_name')
    player2 = request.args.get('second_player_name')
    ......
    return render_template('mega.html', form=form, error=error, x=x, 
    turn=turn,tornado=tornado, renew=renew, player1=player1,player2=player2)

HTML 模板:

<form action="{{url_for('mega')}}" method="get">
    {{ form.hidden_tag() }}
    <h4>Please choose players names!</h4>
    {{form.first_player_name.label}}  {{form.first_player_name}} <br> <br>
    {{form.second_player_name.label}}  {{form.second_player_name}} <br> <br>
    {{form.button}} <br> <br>
</form>

【问题讨论】:

    标签: python-3.x flask flask-wtforms wtforms


    【解决方案1】:

    看看你的函数Mega(),你没有在下一页返回任何东西。您只是接受输入,但没有以任何形式返回它。

    from wtforms import Form, StringField, validators, SubmitField
    from flask_wtf import FlaskForm
    from flask import Flask, render_template, request
    
    
    class ChooseName(FlaskForm):
        first_player_name = StringField("Choose first player name: ", [validators.DataRequired()])
        second_player_name = StringField("Choose second player name: ", [validators.DataRequired()])
        button = SubmitField("Confirm")
    
    app = Flask(__name__)
    app.config['SECRET_KEY'] = "IT_IS_SECRET"
    
    @app.route('/')
    def index():
        form = ChooseName()
        if form.validate_on_submit():
            return redirect(url_for('mega'))
        return render_template('TIC_TAC_TOE_index.html', form=form)
    
    @app.route('/game_page', methods=["GET", "POST"])
    def mega():
        player1 = request.args.get('first_player_name')
        player2 = request.args.get('second_player_name')
        return player1 + ' ' + player2
    
    
    if __name__ == '__main__':
        app.run(port=5000,debug=True)
    

    尝试运行此代码,希望对您有所帮助。 :-)

    【讨论】:

    • 不幸的是它没有帮助,我仍然可以保持字段为空并转到下一页,结果我得到了一个空页面。生成的网址是127.0.0.1:5000/…
    • 按原样复制我的完整代码并将其粘贴到新文件中并运行此代码。它对我来说非常有效,如果它也适用于你,请告诉我!
    • 我已经完成了,但不幸的是,如果我不将任何文本放入文本框中,我仍然会得到空白页面(没有名称的页面)。如果我将信息放在文本框中,我会得到预期的结果,否则只是空字段。验证不起作用 - 不知道为什么 =(
    • 我现在使用标准 html 完成了任务,但仍然不知道为什么 wtf 表单不在我的程序中进行文本字段检查,如果您有任何想法,请告诉我。感谢您的帮助。
    • 你能发布你的完整代码吗?比如包括进口?因为当我尝试使用我的代码提交没有数据的表单时,会弹出“请填写此字段”,这意味着验证器工作正常。
    【解决方案2】:

    这是因为您的操作指向 mega 视图,因此 index if form.validate_on_submit(): 的代码没有被执行。

    您应该更改表单中的操作属性和方法。代码应该如下:

    HTML 模板:

    <form action="" method="post">
        {{ form.hidden_tag() }}
        <h4>Please choose players names!</h4>
        {{form.first_player_name.label}}  {{form.first_player_name}} <br> <br>
        {{form.second_player_name.label}}  {{form.second_player_name}} <br> <br>
        {{form.button}} <br> <br>
    </form>
    

    观看次数:

    from flask import session
    
    @app.route('/')
    def index():
        form = ChooseName()
        if form.validate_on_submit():
            session['first_player_name'] = form.first_player_name.data
            session['second_player_name'] = form.second_player_name.data
            return redirect(url_for('mega'))
        return render_template('TIC_TAC_TOE_index.html', form=form) 
    
    
    @app.route('/game_page', methods=["GET", "POST"])
    def mega():
        player1 = session.pop('first_player_name')
        player2 = session.pop('second_player_name')
        ......
        return render_template('mega.html', form=form, error=error, x=x, 
        turn=turn,tornado=tornado, renew=renew, player1=player1,player2=player2)
    

    您可以在这里https://j2logo.com/tutorial-flask-leccion-3-formularios-wtforms/了解更多关于 WTForms 的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      相关资源
      最近更新 更多