编辑当我单击添加到购物车时,这是输出到终端
[22/Mar/2016 07:07:44] "GET /store/add/7 HTTP/1.1" 302 0
[22/Mar/2016 07:07:44] "GET /store/ HTTP/1.1" 200 4888
我有两种功能,一种是将商品添加到购物车,另一种是移除商品。
我在想问题是我的网址请求格式不正确。因此,我要感谢比我更有经验的人向我解释预期的URL应该是什么。
我正在这样创建我的网址,
url(r'^add/(\d+)', views.add_to_cart, name='add_to_cart'),
url(r'^remove/(\d+)', views.remove_from_cart, name='remove_from_cart'),
url(r'^cart/', views.cart, name='cart'),
将商品添加到购物车的链接位于base.html文件中,看起来像这样,
{% if request.user.is_authenticated %}
<span class="storefront_add_to_cart">
<a href="{% url 'add_to_cart' book.id %}">[Add to Cart]</a>
</span>
{% endif %}
因此,当您在购物车中添加或删除商品时,它会调用相应的功能。
Views.py
def add_to_cart(request,book_id):
if request.user.is_authenticated():
try:
book = Book.objects.get(pk=book_id)
except ObjectDoesNotExist:
pass
else :
try:
cart = Cart.objects.get(user = request.user, active = True)
except ObjectDoesNotExist:
cart = Cart.objects.create(user = request.user)
cart.save()
cart.add_to_cart(book_id)
return redirect('cart')
else:
return redirect('index')
def remove_from_cart(request, book_id):
if request.user.is_authenticated():
try:
book = Book.objects.get(pk = book_id)
except ObjectDoesNotExist:
pass
else:
cart = Cart.objects.get(user = request.user, active = True)
cart.remove_from_cart(book_id)
return redirect('cart')
else:
return redirect('index')
当我单击添加到购物车时,URL看起来像这样(这给了我错误)
http://localhost:8000/store/add/4
当我单击从购物车中删除时,URL看起来像这样,但没有收到任何错误。(购物车中的物品保持原状,不会移除。)
http://localhost:8000/store/cart/%7B%20url%20'remove_from_cart'%20item.book.id%20%%7D
如果有帮助的话,请访问models.py中的各个模型
class Cart(models.Model):
user = models.ForeignKey(User)
active = models.BooleanField(default=True)
order_date = models.DateField(null=True)
payment_type = models.CharField(max_length=100, null=True)
payment_id = models.CharField(max_length=100, null=True)
def __unicode__(self):
return "%s" % (self.user)
def add_to_cart(self, book_id):
book = Book.objects.get(pk=book_id)
try:
preexisting_order = BookOrder.objects.get(book=book, cart=self)
preexisting_order.quantity += 1
preexisting_order.save()
except BookOrder.DoesNotExist:
new_order = BookOrder.objects.create(
book=book,
cart=self,
quantity=1
)
new_order.save()
def __unicode__(self):
return "%s" % (self.book_id)
def remove_from_cart(self, book_id):
book = Book.objects.get(pk=book_id)
try:
preexisting_order = BookOrder.objects.get(book=book, cart=self)
if preexisting_order.quantity > 1:
preexisting_order.quantity -= 1
preexisting_order.save()
else:
preexisting_order.delete()
except BookOrder.DoesNotExist:
pass
让我们一次解决这个问题。
首先,您需要使用login_required
装饰器;您也不应接受将无效的书籍添加到购物车(您目前正在数据库级别检查这些书籍,并且不会向客户显示此错误)。
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404
@login_required
def add_to_cart(request,book_id):
book = get_object_or_404(Book, pk=book_id)
cart,created = Cart.objects.get_or_create(user=request.user, active=True)
cart.add_to_cart(book_id)
return redirect('cart')
接下来,您需要在生成链接的位置修复模板,以从购物车中删除商品。您的链接应为:
<a href="{% url 'remove_from_cart' args=(item.book.id,) %}">Remove item</a>
在您的模型中,您有两种__unicode__
方法,我认为这是复制粘贴中的错误,否则您需要从中删除第二种add_to_cart
方法,由于第二种方法已经缩进了该方法中,所以第二种方法将无法使用models.py
。
无论如何,您都不需要该方法,应该将整个逻辑保留在视图中。这是修改后的方法:
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404
from django.contrib import messages
from .models import Cart, BookOrder, Book
@login_required
def add_to_cart(request,book_id):
book = get_object_or_404(Book, pk=book_id)
cart,created = Cart.objects.get_or_create(user=request.user, active=True)
order,created = BookOrder.objects.get_or_create(book=book,cart=cart)
order.quantity += 1
order.save()
messages.success(request, "Cart updated!")
return redirect('cart')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句