簡體   English   中英

擴展購物車數量的Django視圖/模型

[英]Ammending Django Views/Models for Cart Quantity

我有一個Django購物車項目,可以在購物車中添加和刪除產品。 我似乎無法鍛煉如何向購物車中添加一定數量的數量(每種產品在購物車中的次數)。 我知道我需要在模型中添加一個數量字段。 但是,我應該在哪里更改邏輯-在實際模型或視圖上?

Models.py(包括管理員)

from django.conf import settings
from django.db import models
from django.db.models.signals import pre_save, post_save, m2m_changed
from catalogue.models import Product



User = settings.AUTH_USER_MODEL

# Create your models here.

class CartManager(models.Manager):
    def new_or_get(self, request):
        cart_id = request.session.get("cart_id", None)
        qs = self.get_queryset().filter(id=cart_id)
        if qs.count() == 1:
            new_obj = False
            cart_obj = qs.first()
            if request.user.is_authenticated() and cart_obj.user is None:
                cart_obj.user = request.user
                cart_obj.save()
        else:
            cart_obj = Cart.objects.new(user=request.user)
            new_obj = True
            request.session['cart_id'] = cart_obj.id
        return cart_obj, new_obj


    def new(self, user=None):
        user_obj = None
        if user is not None:
            if user.is_authenticated():
                user_obj = user
        return self.model.objects.create(user=user_obj)

class Cart(models.Model):
    user = models.ForeignKey(User, null=True, blank=True)
    products = models.ManyToManyField(Product, blank=True)
    # quantity = models.IntegerField()
    total = models.DecimalField(default=0.00, max_digits=10, decimal_places=2)
    updated = models.DateTimeField(auto_now=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    objects = CartManager()

    def __str__(self):
        return str(self.id)

def pre_save_cart_receiver(sender, instance, action, *args, **kwargs):
    if action == 'post_add' or action == 'post_remove' or action == 'post_clear':   
        products = instance.products.all()
        total = 0
        for x in products:
            total += x.price
        instance.total = total
        instance.save()

m2m_changed.connect(pre_save_cart_receiver, sender=Cart.products.through)

Views.py

from django.http import JsonResponse
from django.shortcuts import render, redirect
from catalogue.models import Product
from .models import Cart
# Create your views here.

def cart_detail_api_view(request):
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    products = [{"name": x.name, "price": x.price} for x in cart_obj.products.all()]
    cart_data = {"products": products, "total": cart_obj.total}
    return JsonResponse(cart_data)

def cart_home(request):
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    return render(request, "carts/carts.html", {"cart": cart_obj})

def cart_update(request):
    product_id = request.POST.get('product_id')

    if product_id is not None:
        try:
            product_obj = Product.objects.get(id=product_id)
        except Product.DoesNotExist:
            print("Show message to user, product is gone?")
            return redirect("cart:home")
        cart_obj, new_obj = Cart.objects.new_or_get(request)
        if product_obj in cart_obj.products.all():
            cart_obj.products.remove(product_obj)
            added = False
        else:
            cart_obj.products.add(product_obj) # cart_obj.products.add(product_id)
            added = True
        request.session['cart_items'] = cart_obj.products.count()
        # return redirect(product_obj.get_absolute_url())
        if request.is_ajax(): # Asynchronous JavaScript And XML / JSON
            print("Ajax request")
            json_data = {
                "added": added,
                "removed": not added,
            }
            return JsonResponse(json_data)
    return redirect("cart:home")

不要添加IntegerField 您將必須確保每次將新商品添加到購物車時都手動對其進行遞增,並在每次移除商品時遞減。 相反,您可以使用count()方法

def cart_detail_api_view(request):
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    products = [{"name": x.name, "price": x.price} for x in cart_obj.products.all()]
    cart_data = {
        "products": products, 
        "total": cart_obj.total,
        "count": cart_obj.products.count()
    }
    return JsonResponse(cart_data)

您應該看一下Django REST Framework ,它將使您正在做的事情變得更加輕松,簡化和干燥。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM