Здравствуйте уважаемые коллеги!
Сижу пишу корзину на flask основанную на сессии session["cart"], которая состоит из словаря вида [{'product_id': id, 'qty': qty}] т.е. фактически при добавлении товара в корзину мы добавляем его id в базе и количество(qty).
<form action="/add-to-cart" method="post">
<input type="hidden" name="add_to_cart">
<input type="hidden" name="product_id" value="{{ post.id }}">
<input type="hidden" name="qty" value="1">
<button type="submit" name="add_to_cart" class="btn btn-success">Add to Cart</button>
</form>
Моё творение выглядит так:
@app.route('/add-to-cart', methods=['GET', 'POST'])
def add_to_cart():
if request.method == 'POST':
# приводим оба параметра к числу что бы сессия не материлась
id = int(request.form['product_id'])
qty = int(request.form['qty'])
cart_session() # проверяет существует ли сессия корзины и если нет, то создает её, а если да, то норм
# проверяем совпадения id product_id и если оно есть, то прибавляем количество qty к уже существующему
matching = [d for d in session['cart'] if d['product_id'] == id]
if matching:
matching[0]['qty'] += qty
session["cart"].append(dict({'product_id': id, 'qty': qty})) # добавляем товар к сессии в виде словаря
return redirect(url_for('cart'))
Получается следующая картина при добавлении одного и того же товара:
[{'qty': 9, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}]
При добавлении товара мой хреновый алгоритм каждый раз прибавляет количество к первому словарю но и добавляет такой же товар с к сессии корзины.
Необходимо:
- Проверить по id существует ли товар в сессии корзины
- Если существует, не добавлять его в качестве нового товара, а просто увеличивать его количество(qty) в сессии.
==============================================
Решение
@app.route('/add-to-cart', methods=['GET', 'POST'])
def add_to_cart():
if request.method == 'POST':
id = int(request.form['product_id'])
qty = int(request.form['qty'])
cart_session()
matching = [d for d in session['cart'] if d['product_id'] == id]
if matching:
matching[0]['qty'] += qty
else:
session["cart"].append(dict({'product_id': id, 'qty': qty}))
return redirect(url_for('home'))