Значения формы не добавляются в базу данных в Flask - PullRequest
0 голосов
/ 04 августа 2020

Я разместил этот вопрос ранее, но затем он был связан с аналогичным вопросом, не обеспечивающим требуемого решения, и был закрыт для ответа.

Итак, я создал приложение Flask, отслеживающее перемещение продуктов из одного места в другое, пока я перемещаюсь через приложение Flask, форма не проверяется Я попытался добавить {{ form.hidden_tag() }} и {{ form.csrf_token }} в файл html, который принимает данные от пользователя.

Если я запускаю это приложение из терминала в моей командной строке, форма проверяется и добавляется в базу данных, но если я запускаю приложение flask и отправляю форму в браузере, этого не происходит.

вот мой код для того же

class MovementForm(FlaskForm):
    to_location = SelectField('To Location', coerce=int)
    from_location = SelectField('From Location', coerce=int)
    product = SelectField('Product')
    quantity = IntegerField('Quantity')
    add_movement = SubmitField('Add Movement')

@app.route('/movements',methods=["GET","POST"])
def add_movements():
    form = MovementForm()
    form.to_location.choices = [(location.id, location.location_name) for location in Location.query.all()]
    form.from_location.choices = [(location.id, location.location_name) for location in Location.query.all()]
    form.product.choices = [(product.id, product.product_name) for product in Product.query.all()]
    form.from_location.choices.insert(0, (0, 'None'))   
    if form.validate_on_submit():
        new_movement = Movement(to_location_id=form.to_location.data, from_location_id=form.from_location.data, product_id=form.product.data, quantity=form.quantity.data)
        db.session.add(new_movement)
        db.session.commit()
        flash('Product has been moved!', 'success')
        return redirect(url_for('add_movements'))   
    return render_template('add_movements.html', form=form)

Вот мой html файл

 <form action="/movements" method="post">
        {{ form.hidden_tag() }}
        {{ form.csrf_token }}
        <div class="row">
            <div class="form-group col">
                {{ form.from_location.label(class="form-control-label") }}
                {{ form.from_location(class="form-control form-control-lg") }}
            </div>
            <div class="form-group col">
                {{ form.to_location.label(class="form-control-label") }}
                {{ form.to_location(class="form-control form-control-lg") }}
            </div>
        </div>
        <div class="row">
            <div class="form-group col">
                {{ form.product.label(class="form-control-label") }}
                {{ form.product(class="form-control form-control-lg") }}
            </div>
            <div class="form-group col">
                {{ form.quantity.label(class="form-control-label") }}
                {{ form.quantity(class="form-control form-control-lg") }}
            </div>
        </div>
        <div class="form-group">
                {{ form.add_movement(class="btn btn-outline-info") }}
        </div>
    </form> 

Что здесь не так?

1 Ответ

1 голос
/ 04 августа 2020

Попробуйте удалить, чтобы изменить действие формы HTML.

 <form action="" method="post">
    {{ form.hidden_tag() }}
    {{ form.csrf_token }}
    <div class="row">
        <div class="form-group col">
            {{ form.from_location.label(class="form-control-label") }}
            {{ form.from_location(class="form-control form-control-lg") }}
        </div>
        <div class="form-group col">
            {{ form.to_location.label(class="form-control-label") }}
            {{ form.to_location(class="form-control form-control-lg") }}
        </div>
    </div>
    <div class="row">
        <div class="form-group col">
            {{ form.product.label(class="form-control-label") }}
            {{ form.product(class="form-control form-control-lg") }}
        </div>
        <div class="form-group col">
            {{ form.quantity.label(class="form-control-label") }}
            {{ form.quantity(class="form-control form-control-lg") }}
        </div>
    </div>
    <div class="form-group">
            {{ form.add_movement(class="btn btn-outline-info") }}
    </div>
</form> 

Решает ли это проблему?

Также я предлагаю вам добавить Fla sh в HTML, потому что я вижу, что после отправки формы она возвращается к функции add_movements. Поэтому добавьте это:

 <div>
     {% for msg in get_flashed_messages%}
         <h1>{{msg}}</h1>
     {% endfor %}
 </div>
 <form action="" method="post">
{{ form.hidden_tag() }}
{{ form.csrf_token }}
<div class="row">
    <div class="form-group col">
        {{ form.from_location.label(class="form-control-label") }}
        {{ form.from_location(class="form-control form-control-lg") }}
    </div>
    <div class="form-group col">
        {{ form.to_location.label(class="form-control-label") }}
        {{ form.to_location(class="form-control form-control-lg") }}
    </div>
</div>
<div class="row">
    <div class="form-group col">
        {{ form.product.label(class="form-control-label") }}
        {{ form.product(class="form-control form-control-lg") }}
    </div>
    <div class="form-group col">
        {{ form.quantity.label(class="form-control-label") }}
        {{ form.quantity(class="form-control form-control-lg") }}
    </div>
</div>
<div class="form-group">
        {{ form.add_movement(class="btn btn-outline-info") }}
</div>

# EDIT

Я заметил, что что-то отсутствует в поле продукта один раз принудительно отсутствует:

class MovementForm(FlaskForm):
    to_location = SelectField('To Location', coerce=int)
    from_location = SelectField('From Location', coerce=int)
    product = SelectField('Product', coerce=int)
    quantity = IntegerField('Quantity')
    add_movement = SubmitField('Add Movement')

РЕДАКТИРОВАТЬ # 2

Если вы сталкиваетесь с подобными проблемами (что происходит постоянно), я предлагаю вам добавить операторы печати и предложение If / Else. Это существенно поможет вам в том, где находится проблема (проблема с вашим типом проблемы, которую вы опубликовали, заключается в том, что вы «ее не видите») и даст вам «глаза».

Например, это то, что я сделал бы:

@app.route('/movements',methods=["GET","POST"])
def add_movements():

    form = MovementForm()
    form.to_location.choices = [(location.id, location.location_name) for 
    location in Location.query.all()]
    form.from_location.choices = [(location.id, location.location_name) 
    for location in Location.query.all()]
    form.product.choices = [(product.id, product.product_name) for product 
    in Product.query.all()]
    form.from_location.choices.insert(0, (0, 'None')) 

    if form.validate_on_submit():
        print('Form Ok') #if you see the 'Form ok' to see if is validated
        new_movement = Movement(to_location_id=form.to_location.data, 
        from_location_id=form.from_location.data, 
        product_id=form.product.data, quantity=form.quantity.data)
        db.session.add(new_movement)
        db.session.commit()
        flash('Product has been moved!', 'success')
        return redirect(url_for('add_movements'))
     else:
         print('Form Not Ok') #If you see this printed then you see that 
          #is not validated

return render_template('add_movements.html', form=form)
...