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