Проверка поля в WTF Forms Flask, метод перенаправления - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь создать свое первое веб-приложение Flask и обнаружил следующую проблему: у меня две страницы, первая страница должна содержать имена игроков и давать имена следующей странице, но, к сожалению, проверка имени не работает из-за некоторыхпоэтому я могу оставить обязательные поля пустыми и перейти на следующую страницу с пустыми полями имен.

Код колбы:

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>

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Это потому, что ваше действие указывает на мега представление, поэтому код из 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)

Подробнее о WTForms можно узнать здесь https://j2logo.com/tutorial-flask-leccion-3-formularios-wtforms/

1 голос
/ 12 марта 2019

Хорошо глядя на вашу функцию Мега () , вы не вернете ничего на следующей странице.Вы просто принимаете ввод, но не возвращаете его в любой форме.

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)

Попробуйте запустить этот код, надеюсь, это поможет.: -)

...