Flask view shows 400 error instead of template with form

前端 未结 1 546
生来不讨喜
生来不讨喜 2020-11-27 23:13

I\'m trying to display a page with a form, then add a Player to the database when the form is submitted. However, I can\'t view the form because the browser alw

相关标签:
1条回答
  • 2020-11-27 23:47

    Your view accepts GET and POST requests. request.form is only filled out on POST. If you try to access a key that doesn't exist, it raises a 400 error. No keys will exist when you GET the page initially.

    The common pattern for this is to guard code that requires request.form in an if request.method == 'POST' block. Return a redirect after handling the POST request, otherwise return the rendered template.

    from flask import url_for, redirect, render_template
    
    @app.route('/addplayer', methods=['GET', 'POST'])
    def addplayer():
        if request.method == 'POST':
            Post(
                name=request.form['name'],
                available=request.form['available']
            ).save()
            return redirect(url_for('index'))
    
        return render_template('addplayer.html')
    

    Since you appear to be using Flask-WTF, you can use the form's validate_on_submit method instead of checking method. In that case, you can also access the data through the form instance, and use the form to render the inputs for you.

    from flask import url_for, redirect, render_template
    
    @app.route('/addplayer', methods=['GET', 'POST'])
    def addplayer():
        form = AddPlayerForm()
    
        if form.validate_on_submit():
            Post(
                name=form.name.data,
                available=form.available.data
            ).save()
            return redirect(url_for('index'))
    
        return render_template('addplayer.html', form=form)
    
    <form method=post>
        {{ form.hidden_tag() }}
        {{ form.name.label}} {{ form.name }}<br>
        {{ form.available.label }} {{ form.available }}<br>
        <input type=submit value="Add Player">
    </form>
    
    0 讨论(0)
提交回复
热议问题