alohamaloha
alohamaloha

Reputation: 157

How to get a new object after form submittig?

I'm trying flask nad there is a simple task to submit a form. Page is showing a one picture and a form, if form was submitted correctly, picture should be changed, if not - be the same. I can't understand the mechanism of how to show only one object on a page and get another after form submitting. Tried to use iterator over the list of images is folder "static", but my implementation was not working correctly. Please provide me a feedback how to do it in rigth way?

Now I have the simple view:

@app.route("/", methods=["GET", "POST"])
def start_view():
    picture = None
    form = InputForm(csrf_enabled=False)
    if form.validate_on_submit():
        picture = form.picture.data
        form.picture.data = ""

    return render_template('04-2.html', form=form, picture=picture)

class InputForm(Form):
    picture = StringField('What is on a picture?', validators[DataRequired()])
    submit = SubmitField('Submit')

And a simple template:

<body>
    <form method="POST">
    {{ form.picture.label }} {{ form.picture }}
    {{ form.submit() }}
    </form>
    {% if form.errors %}
        <span style="color: red">{{ form.error }}</span>
    {% endif %}
</body>

Thank you!

Upvotes: 0

Views: 79

Answers (1)

shifloni
shifloni

Reputation: 719

Your form doesnt contain any pictures. It has a StringField and a SubmitField. If you want to see any image you need to have an <img> tag in your HTML pointing to the image location in your server your view should look like:

from Flask import session
# in order to use sessions you have to use a secret key for your app
app.secret_key = 'some secret key'
@app.route("/", methods=["GET", "POST"])
def start_view():
    img_list = ['filename1', 'filename2', 'filename3']

    # if this is not the first form submission
    if session.has_key('current'):
        # if we reach the end of the list show the first image again
        if int(session['current']) == len(img_list) - 1:
            session['current'] = 0
        # move to next image
        else:
            session['current'] = int(session['current']) + 1
    else:
        session['current'] = 0

    picture = 'first_image_filename' # this should be the img on load
    form = InputForm(csrf_enabled=False)
    if form.validate_on_submit():
        picture = img_list[int(session['current'])] # the filename of the next image
        form.picture.data = ""

    return render_template('04-2.html', form=form, picture=picture)

so template should look like:

<body>
    <form method="POST">
        {{ form.picture.label }} {{ form.picture }}
        <img src="{{url_for('static', filename='img/' + picture)}}"
        {{ form.submit() }}
    </form>
{% if form.errors %}
    <span style="color: red">{{ form.error }}</span>
{% endif %}
</body>

Upvotes: 1

Related Questions