Как мне эффективно создавать большие формы - FlaskForms - PullRequest
2 голосов
/ 13 мая 2019

Итак, у меня есть конечная точка формы обновления, которая очень велика, я попробовал несколько вещей, чтобы сделать ее динамически созданной, чтобы сжать мой код, но я не могу понять это.

@customers.route("/<int:customer_id>/update_customer", methods=['GET', 'POST'])
# not programmatic - needs work - I do not like this
def update_customer(customer_id):
    post = Post.query.get_or_404(customer_id)
    if post.author != current_user:
        abort(403)
    form = CustomerForm()
    if form.validate_on_submit():
        post.tpi_name = form.tpi_name.data
        post.tpi_ref = form.tpi_ref.data
        post.company_name = form.company_name.data
        post.company_type = form.company_type.data
        post.company_reg = form.company_reg.data
        post.sic_code = form.sic_code.data
        post.vat_number = form.vat_number.data
        db.session.commit()
        flash("That customer's record has been updated!", 'success')
        return redirect(url_for('customers.view_customer',  customer_id=post.id))
    elif request.method == 'GET':
        form.tpi_name.data = post.tpi_name
        form.tpi_ref.data = post.tpi_ref
        form.company_name.data = post.company_name
        form.company_type.data = post.company_type
        form.company_reg.data = post.company_reg
        form.sic_code.data = post.sic_code
        form.vat_number.data = post.vat_number
    return render_template('customers/customers.html', form=form, username=current_user.username,image_file=current_user.image_file, email=current_user.email)        

Так скажем, если бы у нас было более 100 полей в форме, как бы я изменил этот код, чтобы мне не приходилось явно указывать каждое поле.

1 Ответ

2 голосов
/ 14 мая 2019

Основываясь на ответе pjcunningham и изучая wtform docs , я нашел этот фрагмент кода:

def edit_profile(request):
user = User.objects.get(pk=request.session['userid'])
form = EditProfileForm(request.POST, obj=user)

if request.POST and form.validate():
    form.populate_obj(user)
    user.save()
    return redirect('/home')
return render_to_response('edit_profile.html', form=form)

Основываясь на этом, я полагаюВы хотите написать этот код:

if form.validate_on_submit():
    form.populate_obj(post)
    db.session.commit()

    flash("That customer's record has been updated!", 'success')
    return redirect(url_for('customers.view_customer',  customer_id=post.id))

Для второй части вашего кода (ветка "GET") это зависит от ваших намерений.Вы можете заполнить свою форму данными из объекта при его создании:

form = CustomerForm(obj=post)
...