2017-10-05 86 views
0

嘗試通過特定的產品ID來計算購物車中的商品數量,但仍在掙扎。 7個蘋果在籃子裏。我一直在嘗試使用Python的計數功能,但目前不工作。我嘗試下面的代碼添加到我的cart.py文件,但並沒有工作:Django購物籃中的產品數量(按產品編號)

def count_prod(self, product) 
product_id = str(product.id) 
    if product_id in self.cart: 
     return count(self.cart[product_id]) 

這是我cart.py文件

from decimal import Decimal 
from django.conf import settings 
from shop.models import Product 


class Cart(object): 

    def __init__(self, request): 
     """ 
     Initialize the cart. 
     """ 
     self.session = request.session 
     cart = self.session.get(settings.CART_SESSION_ID) 
     if not cart: 
      # save an empty cart in the session 
      cart = self.session[settings.CART_SESSION_ID] = {} 
     self.cart = cart 

    def __len__(self): 
     """ 
     Count all items in the cart. 
     """ 
     return sum(item['quantity'] for item in self.cart.values()) 

    def __iter__(self): 
     """ 
     Iterate over the items in the cart and get the products from the database. 
     """ 
     product_ids = self.cart.keys() 
     # get the product objects and add them to the cart 
     products = Product.objects.filter(id__in=product_ids) 
     for product in products: 
      self.cart[str(product.id)]['product'] = product 

     for item in self.cart.values(): 
      item['price'] = Decimal(item['price']) 
      item['total_price'] = item['price'] * item['quantity'] 
      yield item 

    def add(self, product, quantity=1, update_quantity=False): 
     """ 
     Add a product to the cart or update its quantity. 
     """ 
     product_id = str(product.id) 
     if product_id not in self.cart: 
      self.cart[product_id] = {'quantity': 0, 
             'price': str(product.price)} 
     if update_quantity: 
      self.cart[product_id]['quantity'] = quantity 
     else: 
      self.cart[product_id]['quantity'] += quantity 
     self.save() 

    def remove(self, product): 
     """ 
     Remove a product from the cart. 
     """ 
     product_id = str(product.id) 
     if product_id in self.cart: 
      del self.cart[product_id] 
      self.save() 

    def save(self): 
     # update the session cart 
     self.session[settings.CART_SESSION_ID] = self.cart 
     # mark the session as "modified" to make sure it is saved 
     self.session.modified = True 

    def clear(self): 
     # empty cart 
     self.session[settings.CART_SESSION_ID] = {} 
     self.session.modified = True 

    def get_total_price(self): 
     return sum(Decimal(item['price']) * item['quantity'] for item in self.cart.values()) 

Views.py文件:

from django.shortcuts import render, redirect, get_object_or_404 
from django.views.decorators.http import require_POST 
from shop.models import Product 
from .cart import Cart 
from .forms import CartAddProductForm 


@require_POST 
def cart_add(request, product_id): 
    cart = Cart(request) 
    product = get_object_or_404(Product, id=product_id) 
    form = CartAddProductForm(request.POST) 
    if form.is_valid(): 
     cd = form.cleaned_data 
     cart.add(product=product, 
       # quantity=cd['quantity'], 
       update_quantity=cd['update']) 
    return redirect(product.category.get_absolute_url()) 


def cart_remove(request, product_id): 
    cart = Cart(request) 
    product = get_object_or_404(Product, id=product_id) 
    cart.remove(product) 
    return redirect('cart:cart_detail') 


def cart_detail(request): 
    cart = Cart(request) 
    for item in cart: 
     item['update_quantity_form'] = CartAddProductForm(initial={'quantity': item['quantity'], 
                    'update': True}) 
    return render(request, 'cart/detail.html', {'cart': cart}) 

任何幫助表示讚賞!

回答

0

self.cart[product_id]是形式的字典:

{'quantity': 5, 
'price': '1.50'} 

所以,如果你想要的項目數,只是檢查quantity關鍵

if product_id in self.cart: 
    self.cart['product_id']['quantity'] 
+0

感謝,這是我cart.py文件。如何從我的模板中引用此方法 - 是否必須使用視圖? – Rutnet

+0

這真的是一個單獨的問題,所以我無法幫助。在視圖中調用該方法並將其傳遞給模板可能會更容易。 – Alasdair

+0

好的,謝謝,我會將其作爲一個單獨的問題發佈。 – Rutnet