Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:购物车匹配查询不存在_Django - Fatal编程技术网

Django:购物车匹配查询不存在

Django:购物车匹配查询不存在,django,Django,我有一个表单,若并没有创建购物车对象,它会在字符字段中创建一个带有文本“Random”的购物车。这仅用于在尚未创建此对象的情况下获取该对象的id cart = Cart.objects.get(id=cart_id) 我得到一个错误,表示此查询生成了一个错误,但是我可以将cart\u id的值视为cookie,因此查询应该可以毫无问题地执行。但它不符合错误消息 异常类型:DoesNotExist 异常值:购物车匹配查询不存在 正如你在我看来看到的,我使用的是: cart_id =

我有一个表单,若并没有创建购物车对象,它会在字符字段中创建一个带有文本“Random”的购物车。这仅用于在尚未创建此对象的情况下获取该对象的id

cart = Cart.objects.get(id=cart_id) 
我得到一个错误,表示此查询生成了一个错误,但是我可以将
cart\u id
的值视为cookie,因此查询应该可以毫无问题地执行。但它不符合错误消息

异常类型:DoesNotExist
异常值:购物车匹配查询不存在

正如你在我看来看到的,我使用的是:

    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\u id
如果它不存在,我创建了一个带有随机文本的
cart对象,只是为了获取它的id

为什么我会出错?

查看.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
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)
型号.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
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)
试试这个:

    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,然后它们再次点击DB以检索相同的实例

这个想法是:

  • 会话cookie上是否有
    购物车id
    ?如果是,请尝试基于它获取
    Cart
    对象
  • 如果失败,则表示提供的
    cart\u id
    与数据库中的对象不匹配
  • 如果会话cookie上没有
    cart\u id
    ,只需创建新的
    cart
    对象即可

  • 您正在使用
    Cart\u id='Random'
    创建一个
    Cart
    对象,但您正在尝试使用
    Cart\u id=1
    获取一个
    Cart
    对象。2种不同的数据类型,2种不同的东西。@PankajSharma创建对象时会自动生成id字段。@Alex是,id必须是唯一的,但每个购物车对象上都会生成“随机”文本。我需要像这样创建此对象,以便以后只获取其自动生成的id(自动递增的id)。如果您已经创建了购物车(
    cart=cart.objects.create(cart\u id=“Random”)
    ),为什么要再次查询购物车?@PankajSharma,因为“Random”的字符域不是唯一的,但最近创建的对象的id是唯一的。我需要查询最后创建的购物车。我应该从哪里导入DoesNotExist?我的错。它被称为
    ObjectDoesNotExist
    ,它来自
    django.core.exceptions
    有关该主题的更多信息: