Artiom  Kozyrev
Artiom Kozyrev

Reputation: 3836

Field validation in WTF Forms Flask, redirect method

I am trying to create my first Flask web application and found the following problem, I have two pages, the first page should take players names and give the names to the next page, but unfortunately name validation does not work due to some reason, I can keep the required fields empty and go to next page with empty names fields.

Flask code:

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

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

Upvotes: 1

Views: 922

Answers (2)

j2logo
j2logo

Reputation: 669

This is because your action is pointing to the mega view, so the code from index if form.validate_on_submit(): is not being executed.

You should change the action attribute and method in your form. The code should be as follows:

HTML template:

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

Views:

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)

You can learn more about WTForms here https://j2logo.com/tutorial-flask-leccion-3-formularios-wtforms/

Upvotes: 1

Yash Ghorpade
Yash Ghorpade

Reputation: 607

Well looking at your function Mega(), you're not returning anything on the next page. You're just accepting the input but aren't returning it in any form.

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)

Try to run this code, I hope this helps. :-)

Upvotes: 1

Related Questions