Ошибка типа в /cart/ не удается распаковать не итерируемый объект корзины

#python #django #iterable #iterable-unpacking

#python #django #итерируемый #итерируемый -распаковка

Вопрос:

Я разрабатываю приложение для электронной коммерции в Django. Я все еще разрабатываю локально.

Когда я пытаюсь получить доступ http://127.0.0.1:8000/cart/ , я получаю сообщение об ошибке:

Ошибка типа в /cart/

не удается распаковать не итерируемый объект корзины

 in cart_home
cart_obj, new_obj = Cart.objects.new_or_get(request)
TypeError: cannot unpack non-iterable Cart object

variable  value
request   <WSGIRequest: GET '/cart/'>
 

и я не могу понять, что не так.

Вот мой models.py:

 from django.db import models
from django.conf import settings
from products.models import Product

User = settings.AUTH_USER_MODEL

class CartManager(models.Manager):

    def new_or_get(self, request):
        cart_id = request.session.get("cart_id", None)
        print(cart_id)
        qs = self.get_queryset().filter(id=cart_id)
        if qs.count() == 1 :
            new_obj = False
            print('Cart ID exists')
            cart_obj = qs.first()
    
            if request.user.is_authenticated and cart_obj.user is None:
                cart_obj.user = request.user
                cart_obj.save()
        else:   
            print('Cart ID does not exist')     
            cart_obj = Cart.objects.new(user=request.user)
            new_obj = True
            request.session['cart_id'] = cart_obj.id
    
        return cart_obj

    def new(self, user=None):
        user_obj = None
        if user is not None:
            if user.is_authenticated:
                user_obj = user

        return self.model.objects.create(user=user_obj)

class Cart(models.Model):
    user = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
    products = models.ManyToManyField(Product, blank=True)
    total = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    timestamp = models.DateTimeField(auto_now=True)
    updated = models.DateTimeField(auto_now_add=True)

    objects = CartManager()

    def __str__(self):
        return str(self.id)
 

Вот мой views.py:

 from django.shortcuts import render
from .models import Cart

def cart_home(request):
    cart_obj, new_obj = Cart.objects.new_or_get(request)
    products = cart_obj.products.all()

    total = 0
    for x in products:
        total  = x.price

    print("total")
    print(total)
    cart_obj.total = total
    cart_obj.save()

    return render(request, "carts/home.html", {})
 

Ответ №1:

Оказывается, я забыл добавить аргумент ( new_obj ) в оператор возврата models.py > CartManager > new_or_get

таким образом, он вернул только один аргумент, так что моя команда at views.py > cart_home пыталась присвоить только одно значение ( cart_obj ) двум переменным ( cart_obj, new_obj ) .

Итак, исправление models.py > CartManager > new_or_get заключается в следующем

 def new_or_get(self, request):
    cart_id = request.session.get("cart_id", None)
    print(cart_id)
    qs = self.get_queryset().filter(id=cart_id)
    if qs.count() == 1 :
        new_obj = False
        print('Cart ID exists')
        cart_obj = qs.first()

        if request.user.is_authenticated and cart_obj.user is None:
            cart_obj.user = request.user
            cart_obj.save()
    else:   
        print('Cart ID does not exist')     
        cart_obj = Cart.objects.new(user=request.user)
        new_obj = True
        request.session['cart_id'] = cart_obj.id

    return cart_obj, new_obj