2012-12-30 115 views
1

你好我正在我的電子商務django教程和由於某種原因,我的簡單購物車數不起作用。每次添加到購物車時,我的cart.html中的{{cart_item_count}}都是0Django購物車不更新數量

此外,與此代碼相關的書籍有carts.py作爲cart.py,但由於某些原因該應用程序是購物車犯規是這樣,所以我重新命名我的cart.py「carts.py」,這樣做,從 進口車的車車

不Django的不允許PY文件同名的應用程序???

爲了幫助代碼

carts.py具有功能高清cart_disinct_item_count(請求),返回被稱爲我的views.py設置其顯示在我的車的變量「cart_item_count」計數。 HTML頁面,但目前無論我的表單是什麼,都會返回0.

我沒有發佈整個項目代碼,但我想我得到了所有需要的相關信息。

感謝

cart.html

{% block content %} 
<h1>Cart Page Here</h1> 
Cart item count: {{cart_item_count }} 
{% endblock %} 

車views.py

# Create your views here. 
from django.shortcuts import render_to_response 
from django.template import RequestContext 
from cart import carts as cart 

def show_cart(request, template_name="cart/cart.html"): 
    cart_item_count = cart.cart_disinct_item_count(request) 
    page_title = 'Shopping Cart' 
    return render_to_response("cart/cart.html", locals(), 
          context_instance = RequestContext(request)) 

車項目模型

class CartItem(models.Model): 
cart_id = models.CharField(max_length=50) 
date_added = models.DateTimeField(auto_now_add = True) 
quantity = models.IntegerField(default = 1) 
product = models.ForeignKey('catalog.Product', unique = False) 

class Meta: 
    app_label = '' 
    db_table = 'cart_items' 
    ordering = ['date_added'] 

def total(self): 
    return self.quantity * self.product.price 
def name(self): 
    return self.product.name 
def price(self): 
    return self.product.price 

def get_absolute_url(self): 
    return self.product.get_absolute_url() 
def augment_quantity(self, quantity): 
     """ called when a POST request comes in for a Product instance already in the shopping cart """ 
     self.quantity = self.quantity + int(quantity) 
     self.save() 

carts.py

def get_cart_items(request): 
    return CartItem.objects.filter(cart_id=_cart_id(request)) 

#add an item to the cart 
def add_to_cart(request):  
    postdata = request.POST.copy() 
    #get product slug from post data, return blank if empty 
    product_slug = postdata.get('product_slug', '') 
    #get quantity added, return 1 if empty 
    quantity = postdata.get('quantity', 1) 
    #fetch the product or return a missing page error 
    p = get_object_or_404(Product, slug = product_slug) 
    #get products in cart 
    cart_products = get_cart_items(request) 
    product_in_cart = False 
    #check to see if item is already in cart 
    for cart_item in cart_products: 
     if cart_item.product.id == p.id: 
      #update the quantity if found 
      cart_item.augment_quantity(quantity) 
      product_in_cart = True 
     if not product_in_cart: 
      #create and save a new cart item 
      ci = CartItem() 
      ci.product = p 
      ci.quantity = quantity 
      ci.cart_id = _cart_id(request) 
      ci.save() 
#returns the total number of items in the user's cart 
def cart_disinct_item_count(request): 
    return get_cart_items(request).count() 

forms.py:

class ProductAddToCartForm(forms.Form): 
quantity = forms.IntegerField(widget=forms.TextInput(attrs={'size':'2', 
           'value':'1', 'class':'quantity'}), 
           error_messages={'invalid': 'Please enter a valid quantity'}, 
           min_value = 1) 
product_slug = forms.CharField(widget = forms.HiddenInput()) 

#override the default __init__ so we can set the request 
def __init__(self, request = None, *args, **kwargs): 
    self.request = request 
    super(ProductAddToCartForm, self).__init__(*args, **kwargs) 

* EDIT ** 忘了添加顯示了產品,並調用add_to_cart視圖:

#new product view, with POST vs GET detection 

DEF show_product(請求,product_slug,template_name =「catalog/product.html」):

p = get_object_or_404(Product, slug=product_slug) 

categories = p.categories.all() 
page_title = p.name 
meta_keywords = p.meta_keywords 
meta_description = p.meta_description 
#need to evaluate the HTTP method 
if request.method == 'POST': 

    #add to cart....create the bound form 
    postdata = request.POST.copy() 
    form = ProductAddToCartForm(request, postdata) 

    #check if posted data is valid 
    if form.is_valid(): 
     #add to cart and redirect to cart page 
     cart.add_to_cart(request) 
     # if test cookie worked, get rid of it 
     if request.session.test_cookie_worked(): 
      request.session.delete_test_cookie() 

     url = urlresolvers.reverse('show_cart') 
     return HttpResponseRedirect(url) 
else: 
    # it's a GET, create the unbound form. Note request as a kwarg 
    form = ProductAddToCartForm(request = request, label_suffix = ':') 


    #assign the hidden input the product slug 
    form.fields['product_slug'].widget.attrs['value'] = product_slug 
    #set the test cookie on our first GET request 
    request.session.set_test_cookie() 

    return render_to_response("catalog/product.html", locals(), context_instance=RequestContext(request)) 
+0

*** *** UPDATE好的,我想通了,我add_to_cart(請求)功能在我的carts.py工作不正常...我會嘗試看看究竟發生了什麼,如果我有任何問題,我會發布它... – mcd

回答

2

發現錯誤:)縮進問題(愚蠢的python)j/k第一個是我的,第二個是正確的。得使用這個。很容易忽視對未經訓練的眼睛....

def add_to_cart(request):  
postdata = request.POST.copy() 
product_slug = postdata.get('product_slug', '') 
quantity = postdata.get('quantity', 1) 
p = get_object_or_404(Product, slug = product_slug) 
cart_products = get_cart_items(request) 
product_in_cart = False 
for cart_item in cart_products: 
    if cart_item.product.id == p.id: 
     cart_item.augment_quantity(quantity) 
     product_in_cart = True 
    if not product_in_cart: 
     ci = CartItem() 
     ci.product = p 
     ci.quantity = quantity 
     ci.cart_id = _cart_id(request) 
     ci.save() 

這裏是書籍和它的工作原理:

def add_to_cart(request): 
postdata = request.POST.copy() 
product_slug = postdata.get('product_slug','') 
quantity = postdata.get('quantity',1) 
p = get_object_or_404(Product, slug=product_slug) 
cart_products = get_cart_items(request) 
product_in_cart = False 
for cart_item in cart_products: 
    if cart_item.product.id == p.id: 
     cart_item.augment_quantity(quantity) 
     product_in_cart = True 
if not product_in_cart: 
    ci = CartItem() 
    ci.product = p 
    ci.quantity = quantity 
    ci.cart_id = _cart_id(request) 
    ci.save()