Django: Запрос на сопоставление корзины не существует - PullRequest
0 голосов
/ 03 мая 2019

У меня есть форма, которая создает корзину с текстом «Случайно» в поле символа, если не создан объект корзины. Это только для того, чтобы получить идентификатор этого недавно объекта, если он еще не создан.

cart = Cart.objects.get(id=cart_id) 

Я получаю сообщение об ошибке, говорящее, что этот запрос генерирует ошибку, однако я могу видеть значение cart_id как файл cookie, поэтому запрос должен выполняться без проблем. Но это не соответствует сообщению об ошибке.

Тип исключения: DoesNotExist
Значение исключения: запрос на сопоставление корзины не существует.

enter image description here

Как вы можете видеть на мой взгляд, я использую это:

    cart_id = self.request.COOKIES.get('cart_id')
    if not cart_id:
        cart = Cart.objects.create(cart_id="Random")
        cart_id = cart.id
        cart = Cart.objects.get(id=cart_id)

Чтобы получить cookie cart_id, если он не существует, я создал Cart object со случайным текстом, только чтобы получить его идентификатор.

Почему я получаю ошибку?

View.py

class StepOneView(FormView):
    form_class = StepOneForm
    template_name = 'shop/medidas-cantidades.html'
    success_url = 'subir-arte'

    def get_initial(self):
        # pre-populate form if someone goes back and forth between forms
        initial = super(StepOneView, self).get_initial()
        initial['size'] = self.request.session.get('size', None)
        initial['quantity'] = self.request.session.get('quantity', None)
        initial['product'] = Product.objects.get(
            category__slug=self.kwargs['c_slug'],
            slug=self.kwargs['product_slug']
        )

        return initial

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['product'] = Product.objects.get(
            category__slug=self.kwargs['c_slug'],
            slug=self.kwargs['product_slug']
        )
        return context

    def form_invalid(self, form):
        print('Step one: form is NOT valid')

    def form_valid(self, form):
        cart_id = self.request.COOKIES.get('cart_id')
        if not cart_id:
            cart = Cart.objects.create(cart_id="Random")
            cart_id = cart.id
        cart = Cart.objects.get(id=cart_id)
        item = CartItem.objects.create(
            size=form.cleaned_data.get('size'),
            quantity=form.cleaned_data.get('quantity'),
            product=Product.objects.get(
                category__slug=self.kwargs['c_slug'],
                slug=self.kwargs['product_slug']
            ),
            cart=cart
        )

        response = HttpResponseRedirect(self.get_success_url())
        response.set_cookie("cart_id", cart_id)
        response.set_cookie("item_id", item.id)
        return response

models.py

class Cart(models.Model):
    cart_id = models.CharField(max_length=100)
    date_added = models.DateField(auto_now_add=True)

    class Meta:
        db_table = 'Cart'
        ordering = ['date_added']

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

1 Ответ

2 голосов
/ 03 мая 2019

Попробуйте это:

    def form_valid(self, form):
        cart_id = self.request.COOKIES.get('cart_id')
        if cart_id:
            try:
                cart = Cart.objects.get(id=cart_id)
            except ObjectDoesNotExist:
                # supplied ID doesn't match a Cart from your BD
                cart = Cart.objects.create(cart_id="Random")
        else:
            cart = Cart.objects.create(cart_id="Random")

Нет необходимости создавать Cart объекты, просто чтобы получить его ID, и они снова попадают в БД, чтобы получить тот же экземпляр.

Идеяis:

  1. Есть ли у вас cart_id в сеансовых куки?Если это так, попробуйте получить объект Cart на его основе.
  2. Если это не удастся, это означает, что предоставленный cart_id не соответствует объекту из вашей БД
  3. Если нетcart_id для файлов cookie сеанса, а затем просто создайте новый объект Cart.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...