首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django购物车不更新数量

Django购物车不更新数量
EN

Stack Overflow用户
提问于 2012-12-30 04:18:19
回答 1查看 2.6K关注 0票数 1

你好,我正在做我的电子商务django教程,由于某种原因,我的简单购物车计数不起作用。每次我在购物车中添加cart.html中的{{cart.html}是0

另外,在这段代码中,书中有我的carts.py作为cart.py,但是由于应用程序是购物车,所以我不喜欢这个,所以我将cart.py重新命名为"carts.py“,并从购物车中将其命名为cart。

Django不允许与应用程序同名的py文件吗?

以帮助编写代码

carts.py有一个函数def cart_disinct_item_count(Cart_disinct_item_count),它返回在cart_disinct_item_count中调用的计数,以设置变量"cart_item_count“,该变量显示在cart_disinct_item_count页面中,但当前无论表单的返回值是0。

我没有发布整个项目代码,但我想我得到了所有需要的相关信息。

谢谢

cart.html

代码语言:javascript
运行
复制
{% block content %}
<h1>Cart Page Here</h1>
Cart item count: {{cart_item_count }}
{% endblock %}

cart views.py

代码语言:javascript
运行
复制
# 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))

购物车项目模型

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
#new product view, with POST vs GET detection

def show_product(请求,product_slug,template_name = "catalog/product.html"):

代码语言:javascript
运行
复制
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))
EN

Stack Overflow用户

回答已采纳

发布于 2012-12-31 04:08:42

发现错误:)缩进问题(愚蠢的python) j/k,第一个是我的,第二个是正确的。一定要习惯这个。很容易被未经训练的人所忽视.

代码语言:javascript
运行
复制
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()

这是书,它起作用了:

代码语言:javascript
运行
复制
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()
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14088282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档