Количество обновлений и обновление корзины Django

#python-3.x #django #django-views

#python-3.x #django #django-просмотры

Вопрос:

Добавить корзину Vuew

 def add_to_cart_view(request,pk):
products=models.Product.objects.all()

#for cart counter, fetching products ids added by customer from cookies
if 'product_ids' in request.COOKIES:
    product_ids = request.COOKIES['product_ids']
    counter=product_ids.split('|')
    product_count_in_cart=len(set(counter))
else:
    product_count_in_cart=1

response = render(request, 'ecom/index.html',{'products':products,'product_count_in_cart':product_count_in_cart})

#adding product id to cookies
if 'product_ids' in request.COOKIES:
    product_ids = request.COOKIES['product_ids']
    if product_ids=="":
        product_ids=str(pk)
    else:
        product_ids=product_ids "|" str(pk)
    response.set_cookie('product_ids', product_ids)
else:
    response.set_cookie('product_ids', pk)

product=models.Product.objects.get(id=pk)
messages.info(request, product.name   ' added to cart successfully!')

return response
  

Просмотр корзины перед оформлением заказа

 def cart_view(request):
#for cart counter
if 'product_ids' in request.COOKIES:
    product_ids = request.COOKIES['product_ids']
    counter=product_ids.split('|')
    product_count_in_cart=len(set(counter))
else:
    product_count_in_cart=0

# fetching product details from db whose id is present in cookie
products=None
total=0
if 'product_ids' in request.COOKIES:
    product_ids = request.COOKIES['product_ids']
    if product_ids != "":
        product_id_in_cart=product_ids.split('|')
        products=models.Product.objects.all().filter(id__in = product_id_in_cart)

        #for total price shown in cart
        for p in products:
            total=total p.price
return render(request,'ecom/cart.html',{'products':products,'total':total,'product_count_in_cart':product_count_in_cart})
  

Модель продуктов

 class Product(models.Model):
name=models.CharField(max_length=40)
product_image= models.ImageField(upload_to='product_image/',null=True,blank=True)
price = models.PositiveIntegerField()
description=models.CharField(max_length=40)
def __str__(self):
    return self.name
  

Я хочу, чтобы на странице корзины было поле, которое будет принимать «Целочисленный ввод» и обновлять общую цену

Представить изображение просмотра корзины

введите описание изображения здесь

Как я хочу

введите описание изображения здесь

Я новичок, пытаюсь и учусь, поэтому, пожалуйста, помогите мне разобраться в этом

Понадобятся ли мне какие-либо новые модели или представления?

Спасибо

Ответ №1:

у меня есть идея после нажатия кнопки «добавить в корзину» перенаправить на новую страницу с формой товара, чтобы получить заказанное количество.. вот так :

 {% extends 'base.html' %}
{% load static %}
{% block content %}
<div style="text-align:center";>
<h2 style="color: darkcyan;font-family: monospace;font-size: 55px;">Add item to your cart</h2><br>
<form method="POST">
    {% csrf_token %}
    <h5 style="font-size: 20px;color: blueviolet;">{{ product.name }}</h5>
    <input name="ordered_qty" min="1" max="{{ product.quantity }}" type="number" oninput="validity.valid||(value='');" required>
    <br><br>
    <button class="btn btn-primary" type="submit" name="add_item">Add item</button>
</form>
{% endblock content %}
  

а затем добавьте свое представление в счетчик обновлений и cookie (для установки упорядоченного количества) и сохраните в файлах cookie

 def add_to_cart_view(request, pk):
    if request.method == 'POST':
        # take ordered qty and product id to create cookie
        ordered_quantity = int(request.POST.get('ordered_qty'))
        # Update Counter
        if 'product_ids' in request.COOKIES:
            product_ids = request.COOKIES['product_ids']
            product_ids = json.loads(product_ids)
            products_list_ids = [k['id'] for k in product_ids]
        # if pk of product exist in counter don't incremment counter
            if pk in products_list_ids:
                products_count_in_cart = len(set(products_list_ids))
        # else : (new product in cart) increment counter
            else:
                products_count_in_cart = len(set(products_list_ids))   1
        else:
            products_count_in_cart = 1
        # Back to home page
        products = Product.objects.filter(quantity__gt=0)
        response = render(request, 'home.html', {'products': products, "products_count_in_cart": products_count_in_cart})
        # Update Cookie by adding product id and qty
        if 'product_ids' in request.COOKIES:
            product_ids = request.COOKIES['product_ids']
            products_list = json.loads(product_ids)
            products_ids_list = [i['id'] for i in products_list ]
            if pk not in products_ids_list:
                products_list.append({'id': pk, 'ordered_qty': ordered_quantity})
                response.set_cookie('product_ids', json.dumps(products_list))
        else:
            response.set_cookie('product_ids', json.dumps([{'id': pk, 'ordered_qty': ordered_quantity}]))
        return response
    else:
        product = Product.objects.get(id=pk)
        return render(request, 'add_item_to_cart.html', {'product': product})
  

Наконец, вы можете просматривать заказанные количества в любом месте..
это мое решение, и я применил его в своем проекте .. он отлично работает
Еще одна идея: найдите, как добавить вложенный шаблон на вашей домашней странице, чтобы добавить заказанные количества..