[Flask] Multiple forms linked to a single submit button

Kyle Lawlor klawlor419 at gmail.com
Thu Sep 10 20:55:29 CEST 2015


Here is a change to the view function that makes the two string fields with
two submit buttons work individually.

def index():
    name1 = None
    form1 = MyForm(prefix='form1')
    name2 = None
    form2 = MyForm(prefix='form2')
        if form1.validate_on_submit() and request.form['btn']=='form1':
            name1 = form1.name.data
        print form1.name, name1
        form1.name.data = ''
    elif form2.validate_on_submit() and request.form['btn']=='form2':
        name2 = form2.name.data
        print form2.name, name2
        form2.name.data=''
    return render_template('index.html',
                form1=form1,
                form2=form2)

Not that this answers the question, but I think for completeness why not
add it to the email chain. Perhaps it is incorrect anyway. In which case
please feel free to correct me.

On Thu, Sep 10, 2015 at 2:16 PM, Kyle Lawlor <klawlor419 at gmail.com> wrote:

> Hi all,
>
> I am very new to Flask and web development. I have been working through
> the Flask book by Grinberg. I am having trouble with the following sort of
> thing. I would like to have multiple string fields triggered by the same
> submit button. I would like to have all of the string fields as required.
>
> Here is my Flask script:
>
> from flask import Flask
> from flask import render_template, request
> from flask_wtf import Form
> from wtforms import StringField
> from wtforms.validators import Required
>
> app = Flask(__name__)
> app.config['SECRET_KEY'] = 'string'
>
> class MyForm(Form):
>     name = StringField('name', validators=[Required()])
>
> @app.route('/',methods=['GET','POST'])
> def index():
>     name1 = None
>     form1 = MyForm(prefix='form1')
>     name2 = None
>     form2 = MyForm(prefix='form2')
>     print request
>         if form1.validate_on_submit():
>             name1 = form1.name.data
>             print name1
>             form1.name.data = ""
>     elif form2.validate_on_submit():
>             name2 = form2.name.data
>             print name2
>             form2.name.data=""
>     return render_template('index.html',
>                 form1=form1,
>                 form2=form2)
>
> if __name__=='__main__':
>     app.run(host='0.0.0.0',debug=True)
>
> Here is my templates/index.html:
>
> <!doctype html>
> <form method="POST" action="/">
>     {{ form1.csrf_token }}
>     {{ form1.name.label }} {{ form1.name(size=20) }}
>     <input type="submit" name='btn' value="form1">
> </form>
> <form method="POST" action="/">
>     {{ form2.csrf_token }}
>     {{ form2.name.label }} {{ form2.name(size=20) }}
>     <input type="submit" name='btn' value="form2">
> </form>
> </html>
>
> Right now I have two buttons that do not properly submit data for each
> field, that is answered here though
> <http://stackoverflow.com/questions/18290142/multiple-forms-in-a-single-page-using-flask-and-wtforms/18293534#18293534>.
> Again, I would like to have a single input button that links to both
> required string fields.
>
> Here is pseudocode of how I see it happening :
>
> <!doctype html>
> <form method="POST" input-id="trigger" action="/">
>     {{ form1.csrf_token }}
>     {{ form1.name.label }} {{ form1.name(size=20) }}
> </form>
> <form method="POST" input-id="trigger" action="/">
>     {{ form2.csrf_token }}
>     {{ form2.name.label }} {{ form2.name(size=20) }}
> </form>
> <input type="submit" name='btn' input-id="trigger" value="form2">
> </html>
>
> ,  where input-id="trigger" links the forms to the submit button.
>
> I suppose this is more of an html question as written,  but perhaps there
> is a better way to do this in the Flask-WTForms framework.
>
> Thanks,
> Kyle
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/flask/attachments/20150910/6310152f/attachment.html>


More information about the Flask mailing list