【问题标题】:DJANGO: Product matching query does not existDJANGO:产品匹配查询不存在
【发布时间】:2021-07-25 07:29:52
【问题描述】:

Error message

我不明白这是怎么回事。我完全按照课程做所有事情,但敲出一个错误: 请求 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}"

Database Database2

在 3.2.4 版本中,Django 会抛出此错误,在 2.8 版本中,它会将其抛出到另一个页面(而不是当前页面),并且有时会在购物车中添加一个新项目并且永远不会将其从其中删除。我看到了使用 get_or_404 的建议,但它无法修复错误。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您有两个 完全 重叠的 url 模式。这意味着如果您调用该视图,它将触发第一个视图。

    因此,您应该使 url 模式不完全重叠,最好完全不重叠,所以:

    urlpatterns = [
        path('', products, name="index"),
        path('basket-add/<int:product_id>/', basket_add, name="basket_add"),
        path('basket-delete/<int:id>/', basket_delete, name="basket_delete")
    ]

    所以对于第二条路径,我们将basket-add/ 替换为basket-delete/


    注意Section 9 of the HTTP protocol 指定像 GET 和 HEAD 这样的请求应该有副作用,所以你 不应更改具有此类请求的实体。通常是 POST、PUT、PATCH 和 DELETE 请求用于此目的。在这种情况下,您可以制作一个小的&lt;form&gt; 将触发 POST 请求,或者您使用一些 AJAX 调用。

    【讨论】:

    • 非常感谢!现在删除工作正常,但是当您添加相同的产品时,数量不会添加到购物车中.. 此外,当您从购物车中删除它时,不再可以再次添加。
    • @execution:您的逻辑会删除购物车本身,而不是从购物车中删除产品。
    • @execution:请不要添加永久重定向,而是简单的重定向。否则浏览器下次会跳过添加。您可能还应该清除浏览器缓存,以便浏览器再次开始发出请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2015-01-28
    • 2022-01-05
    • 2020-10-15
    • 2016-05-11
    相关资源
    最近更新 更多