【发布时间】:2021-07-25 07:29:52
【问题描述】:
我不明白这是怎么回事。我完全按照课程做所有事情,但敲出一个错误: 请求 URL:http://127.0.0.1:8000/products/basket-add/12/ Django 版本:3.2.4 异常类型:DoesNotExist 异常值: 产品匹配查询不存在。
添加对象:
def basket_add(request, product_id):
current_page = request.META.get('HTTP_REFERER')
product = Product.objects.get(id=product_id)
baskets = Basket.objects.filter(user=request.user, product=product)
if not baskets.exists():
Basket.objects.create(user=request.user, product=product, quantity=1)
return HttpResponsePermanentRedirect(current_page)
else:
basket = baskets.first()
basket.quantity += 1
basket.save()
return HttpResponsePermanentRedirect(current_page)
删除:
def basket_delete(request, id):
basket = Basket.objects.get(id=id)
basket.delete()
return HttpResponsePermanentRedirect(request.META.get('HTTP_REFERER'))
模板:
<a href="{% url 'products:basket_delete' basket.id %}" style="text-decoration: none; color: gray;">
<i class="far fa-trash-alt"></i>
</a>
网址:
from django.urls import path
from products.views import products, basket_add, basket_delete
app_name = 'products'
urlpatterns = [
path('', products, name="index"),
path('basket-add/<int:product_id>/', basket_add, name="basket_add"),
path('basket-add/<int:id>/', basket_delete, name="basket_delete"),
]
型号:
from django.db import models
from users.models import User
class ProductCategory(models.Model):
name = models.CharField(max_length=64, unique=True)
description = models.TextField(blank=True)
class Meta:
verbose_name_plural = "Product Categories"
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=256)
image = models.ImageField(upload_to='products_images', blank=True)
description = models.TextField(blank=True)
short_description = models.CharField(max_length=64, blank=True)
price = models.DecimalField(max_digits=8, decimal_places=2, default=0)
quantity = models.PositiveIntegerField(default=0)
category = models.ForeignKey(ProductCategory, on_delete=models.CASCADE)
def __str__(self):
return f"{self.name} ({self.category.name})"
class Basket(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField(default=0)
created_timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Basket for {self.user.username} | Product {self.product.name}"
在 3.2.4 版本中,Django 会抛出此错误,在 2.8 版本中,它会将其抛出到另一个页面(而不是当前页面),并且有时会在购物车中添加一个新项目并且永远不会将其从其中删除。我看到了使用 get_or_404 的建议,但它无法修复错误。
【问题讨论】: