AttributeError:“tuple”对象没有属性“product”

2024-05-13 22:16:41 发布

您现在位置:Python中文网/ 问答频道 /正文

当我转到url:http://127.0.0.1:8000/addToCart/1/时,它应该将产品添加到购物车中。但它正在显示>;AttributeError:“tuple”对象没有属性“product”

也许我弄错了

models.py:

class Cart(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
    session_key = models.CharField(max_length=200, blank=True)
    product = models.ManyToManyField(Product, related_name='product_items')

views.py:

@api_view(['GET'])
def addToCart(request, pk):
    product = Product.objects.get(id=pk)
    if request.user.is_authenticated: #user is authenticated
        mycart = Cart.objects.get_or_create(user=request.user)
        mycart.product.add(product) # <--- here is the problem
    else:
        print(request.session.session_key)

    return Response({'response':'ok'})

URL.py: path('addToCart/<str:pk>/', views.addToCart, name='addToCart'),

将产品添加到购物车需要更改什么


Tags: keypyidtrue产品ismodelsrequest
1条回答
网友
1楼 · 发布于 2024-05-13 22:16:41

^{} [Django-doc]返回一个2元组,第一项为Cart对象,第二项为bool对象,用于确定对象是否已创建

因此,您应该通过以下方式来实现这一点:

from django.shortcuts import get_object_or_404

@api_view(['GET'])
def addToCart(request, pk):
    product = get_object_or_404(Product, pk=pk)
    if request.user.is_authenticated: #user is authenticated
        #     &downarrow; unpack the 2-tuple
        mycart, __ = Cart.objects.get_or_create(user=request.user)
        mycart.product.add(product)
    else:
        print(request.session.session_key)

    return Response({'response':'ok'})

Note: It is often better to use get_object_or_404(…) [Django-doc], then to use .get(…) [Django-doc] directly. In case the object does not exists, for example because the user altered the URL themselves, the get_object_or_404(…) will result in returning a HTTP 404 Not Found response, whereas using .get(…) will result in a HTTP 500 Server Error.


Note: Section 9 of the HTTP protocol specifies that requests like GET and HEAD should not have side-effects, so you should not change entities with such requests. Normally POST, PUT, PATCH, and DELETE requests are used for this. In that case you make a small <form> that will trigger a POST request, or you use some AJAX calls.

相关问题 更多 >