Django - объект AnonymousUser не повторяется - PullRequest
0 голосов
/ 06 апреля 2020

Получение ошибки для AnonymousUser. То, что я здесь пишу, предназначено только для аутентифицированного пользователя. Но не прошедший проверку подлинности пользователь не может добавить товар.

Я хочу работать так, как если бы пользователь зашел на сайт и нажал кнопку «Добавить в корзину», продукт должен быть добавлен в корзину. Затем, когда он пытается войти. Товары должны быть в корзине.

cart models.py

# Create your models here.
class CartItem(models.Model):
    owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
    item = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    item_total = models.DecimalField(default=0.00, max_digits=5, decimal_places=2)

    def __str__(self):
        return f"{self.quantity} of {self.item.name}"

def pre_save_cart_item(sender, instance, *args, **kwargs):
    instance.item_total = instance.quantity * instance.item.price

pre_save.connect(pre_save_cart_item, sender=CartItem)

class Cart(models.Model):
    owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE, related_name='cart')

    items = models.ManyToManyField(CartItem)
    number_of_items = models.PositiveIntegerField(default=0)

    total = models.DecimalField(default=0.00, max_digits=5, decimal_places=2)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    purchased = models.BooleanField(default=False)

    def __str__(self):
        return f"User: {self.owner}, items in cart {self.number_of_items}"

def m2m_save_cart(sender, action, instance, *args, **kwargs):
    if action == 'post_add' or action == 'post_remove' or action == 'post_clear':
        instance.number_of_items = instance.items.count()
        items = instance.items.all()
        instance.total = 0
        for x in items:
            instance.total += x.item_total
        instance.save()


m2m_changed.connect(m2m_save_cart, sender=Cart.items.through)

cart views.py

# Create your views here.

def add_to_cart(request, slug):
    item = get_object_or_404(Product, slug=slug)

    cart_item, created = CartItem.objects.get_or_create(
        item=item,
        owner = request.user,
    )
    cart_qs = Cart.objects.filter(owner=request.user, purchased=False)
    if cart_qs.exists():
        cart = cart_qs[0]
        if cart.items.filter(item__slug=item.slug).exists():
            cart_item.quantity += 1
            cart_item.save()
            return redirect('products:product-list')
        else:
            cart.items.add(cart_item)
            return redirect('products:product-list')
    else:
        cart = Cart.objects.create(
            owner=request.user
        )
        cart.items.add(cart_item)
        return redirect('products:product-list')

def remove_from_cart(request, slug):
    item = get_object_or_404(Product, slug=slug)
    cart_qs = Cart.objects.filter(owner=request.user, purchased=False)
    if cart_qs.exists():
        cart = cart_qs[0]
        print('cart_qs exists')
        if cart.items.filter(item__slug=item.slug).exists():
            print('item exists in cart')
            cart_item = CartItem.objects.filter(
                item = item,
                owner = request.user,
            )[0]
            cart.items.remove(cart_item)
            print('removed from cart')
            cart_item.delete()
            return redirect('products:product-list')
        else:
            print('item not in cart')
            return redirect('')
    else:
        return redirect('')
        print('no cart_qs')

def remove_single_item_from_cart(request, slug):
    item = get_object_or_404(Product, slug=slug)
    cart_qs = Cart.objects.filter(owner=request.user, purchased=False)
    if cart_qs.exists():
        cart = cart_qs[0]
        print('cart_qs exists')
        if cart.items.filter(item__slug=item.slug).exists():
            print('item exists in cart')
            cart_item = CartItem.objects.filter(
                item = item,
                owner = request.user,
            )[0]
            if cart_item.quantity > 1:
                cart_item.quantity -= 1
                cart_item.save()
                print(item,'quantity decreased')
            else:
                cart.items.remove(cart_item)
                print('removed from cart')
            return redirect('products:product-list')
        else:
            print('item not in cart')
            return redirect('products:product-list')
    else:
        print('no cart_qs')
        return redirect('products:product-list')

TRACEBACK

Внутренняя ошибка сервера: / cart / cart / add-to-cart / test-product-1 Трассировка (последний последний вызов):

Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ core \ handlers \ exception.py ", строка 34, во внутреннем ответе = get_response (запрос)

Файл" C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ core \ handlers \ base.py ", строка 115, в _get_response response = self.process_exception_by_middleware (e, request)

Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ core \ handlers \ base.py", строка 113, в _get_response response = wrapped_callback (request, * callback_args, * * callback_kwargs)

Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ src \ carts \ views.py", строка 14, в add_to_cart cart_item, созданный = CartItem.objec ts.get_or_create (

Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ manager.py", строка 82, в manager_method вернуть getattr (self.get_queryset (), name) (* args, ** kwargs)

Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ query.py ", строка 559, в get_or_create возвращает self.get (** kwargs), False

File" C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ query.py ", строка 404, в get clone = self._chain (), если self.query.combinator еще self.filter (* args, ** kwargs)

Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ query.py", строка 904, в фильтре возвращает self. _filter_or_exclude (False, * args, ** kwargs)

Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ query. py ", строка 923, в _filter_or_exclude clone.query.add_q (Q (* args, ** kwargs))

Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ sql \ query.py", строка 1350, в предложении add_q, _ = self._add_q (q_object, self.used_aliases)

Файл "C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ sql \ query .py ", строка 1377, в _add_q child_clause, required_inner = self.build_filter (

Файл" C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ sql \ query.py ", строка 1284, в build_filter self.check_related_objects (join_info.final_field, value, join_info.opts)

Файл" C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ db \ models \ sql \ query.py ", строка 1124, в check_related_objects для v в значении:

Файл" C: \ Users \ debop \ OneDrive \ Documents \ GitHub \ MONDAY \ lib \ site-packages \ django \ utils \ functions.py ", строка 225, во внутреннем потоке возврата c (self._wrapped, * args)

TypeError: Объект AnonymousUser не является t итерируемый [06 / Apr / 2020 16:09:07] "GET / корзина / корзина / добавить в корзину / тест-продукт-1 HTTP / 1.1" 500 116667

...