публикация wtforms Flask в цикле и сохранение данных

#python #flask #e-commerce #wtforms #flask-wtforms

#python #flask #электронная коммерция #wtforms #колба-wtforms #flask-wtforms

Вопрос:

У меня есть поля формы Flask-WTF в цикле for. Я хочу опубликовать новые количества для каждого элемента.

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

 @app.route('/checkout')
def checkout():
   form = CartForm()
    for item in current_user.cart:
        product = Product.query.get(item.product_id)
        cart_items.append({product: item.quantity})

    return render_template('checkout.html',cart_items=cart_items,form=form)



{% for item in cart_items %}
    {% for product, quantity in item.items() %}
        {{product.name}}
        {{product.price}}
        {{form.quantity }}
    {% endfor %}
{% endfor %}
  

Проблема 1: при циклическом переборе каждого поля формы Flask-WTF имеет одно и то же имя.

Вывод

 <select id="quantity" name="quantity"><option value="1">1</option></select>
<select id="quantity" name="quantity"><option value="1">1</option></select>
  

проблема 2: как сохранить в резервной копии, если каждая форма имеет другое имя.

Ответ №1:

У меня точно такая же проблема! Но я решаю это без Flask-WTF, решение, приведенное ниже, было основано на моем приложении. У меня есть страница редактирования альбома, мне нужно зациклить ввод текста для каждого изображения в альбоме, а затем сохранить текст для каждого изображения.

Я зацикливаю ввод в HTML, обратите внимание, что я устанавливаю значение действия для другой функции просмотра и использую идентификатор каждой фотографии в качестве имени каждого текстового ввода:

 <form action="{{ url_for('edit_photo', id=album.id) }}" method="POST">
<ul>
    {% for photo in photos %}
    <li>
        <img class="img-responsive portrait" src="{{ photo.path }}" alt="Some description"/>
        <textarea name="{{ photo.id }}" placeholder="add some description" rows="3">{% if photo.description %}{{ photo.description }}{% endif %}</textarea>
    </li>
    {% endfor %}
</ul>
<hr>
<input class="btn btn-success" type="submit" name="submit" value="submit">
  

Затем я зацикливаю изображение и сохраняю входные данные (получаю его значение по его идентификатору):

 @app.route('/edit-photo/<int:id>', methods=['GET', 'POST'])
@login_required
def edit_photo(id):
    album = Album.query.get_or_404(id)
    photos = album.photos.order_by(Photo.order.asc())
    if request.method == 'POST':
        for photo in photos:
            photo.about = request.form[str(photo.id)]
            db.session.add(photo)
        return redirect(url_for('.album', id=id))
    return render_template('edit_photo.html', album=album, photos=photos)
  

Комментарии:

1. это не то, что я хотел, потому что я хотел дать им уникальные имена, чтобы я мог добавлять что-то с помощью javascript, за это было полезно большое спасибо

2. Обратите внимание, что я использую photo.id для имени значение: name="{{ photo.id }}" , поэтому каждый ввод будет иметь уникальное имя.