Mr.Sparkle
Mr.Sparkle

Reputation: 173

SQLAlchemy with Flask does not commit

When I submit my form from webpage, I am not able to commit. Flashing data I need, I see they're there and correct, but something fails when committing. I am sure I am making a mistake somewhere because mostly commit are working except two. This is one of the two that is not working.

Models:

class Feedback(db.Model):
    __tablename__ = 'feedback'
    id = db.Column(db.Integer, primary_key = True)
    rate = db.Column(db.Integer)
    comment = db.Column(db.Text())
    sender_id = db.Column(db.Integer)
    receiver_id = db.Column(db.Integer)

Forms:

class LeaveFeedbackForm(Form):
    rate =  IntegerField('Rate', validators = [DataRequired(),
                                               NumberRange(min = 1, max = 5, message = 'Rates admitted are only 1,2,3,4,5')])
    comment = TextAreaField('Comment', validators = [DataRequired()])
    submit = SubmitField('Submit')

Views:

@app.route('/leave_feedback/<sender>/<receiver>', methods = ['GET', 'POST'])
def leave_feedback(receiver, sender):
    form = LeaveFeedbackForm()
    rec = int(receiver)
    sen = int(sender)
    if form.validate_on_submit():
        feedback = Feedback( rate = form.rate.data,
                             comment = form.comment.data,
                             receiver_id = rec,
                             sender_id = sen
                            )
        db.session.add(feedback)
        db.session.commit()
        flash('Feedback Left Correctly.')
        return redirect(url_for('index'))
    flash(form.rate.data)
    flash(form.comment.data)
    flash(rec)
    flash(sen)
    return render_template('leave_feedback.html', receiver_id = receiver, sender_id = sender, form = form)

html:

{% block content %}
    <div class="row">
        <div class="large-6 columns">
            <h1>Leave Feedback</h1>
        </div>
    </div>

  <form action="" method="post" name="leavefeedback">
      <div class="row">
        <div class="large-6 columns">
            <label>Rate
                {{ form.rate }}
            </label>
        </div>
       </div>

      <div class="row">
        <div class="large-6 columns">
            <label>Comment
                {{ form.comment }}
            </label>
        </div>
       </div>


      <div class="row">
          <div class="large-6 columns">
            <input class="button radius" type="submit" value="Leave Feedback">
         </div>
      </div>

  </form>
{% endblock %}

Upvotes: 1

Views: 477

Answers (2)

Jimilian
Jimilian

Reputation: 3919

You should add an else statement:

if form.validate_on_submit():
     ...
else:
    for error in form.errors.itervalues():
        flash(error[0])

Then you will get an error message from form.

Upvotes: 2

Mr.Sparkle
Mr.Sparkle

Reputation: 173

I figured out my mistake, I simply forgot in my form:

{{ form.hidden_tag() }}

Upvotes: 1

Related Questions