MultipleObjectsReturned at /sport/1/ get() 返回了多个产品——它返回了 3

MultipleObjectsReturned at /sport/1/ get() returned more than one Product -- it returned 3

我正在按类别对产品进行分类。当我查看产品的详细信息时,程序输出以下错误:

多个对象在 /default/1/ 返回 get() 返回了不止一个产品 -- 它返回了 2! Users/artemiikhristich/PycharmProjects/Eshop-original/store/views.py,第 114 行,在 product_detail 中 product = get_object_or_404(Product, slug=slug)

product.html

此模板用于查看产品详情

% extends "store/main.html" %}



{% block content %}
{% load static %}


<link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Tutorial</title>
    <!-- Fonts -->
    <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500" rel="stylesheet">
    <!-- CSS -->
    <link href="static/css/style.css" rel="stylesheet">
    <meta name="robots" content="noindex,follow" />

  </head>

  <body>
    <main class="container">

      <!-- Left Column / Headphones Image -->



      <!-- Right Column -->
      <div class="right-column">

        <!-- Product Description -->
        <div class="product-description">
          <span></span>
            <h1>{{product.name}}</h1>
                  <div class="left-column">
        <img data-image="black" src="{{ product.imageURL }}">


      </div>
            <p>"{{product.description}}"</p>
        </div>


        <!-- Product Configuration -->

        </div>

        <!-- Product Pricing -->
        <div class="product-price">
            <button data-product="{{product.id}}" data-action="add" class="btn btn-outline-secondary add-btn update-cart">Add to Cart</button>

            <div class="product-configuration">
              <a href="#">How to take the measurements</a>
            </div>
        </div>
      </div>
    </main>

    <!-- Scripts -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" charset="utf-8"></script>
    <script src="static/js/script.js" charset="utf-8"></script>
  </body>
</html>

{% endblock %}

views.py

这里我有 product_detail 和 category_detail

的观点
class ProductList(ListView):
    model = Product


def product_detail(request, category_slug, slug):
    product = get_object_or_404(Product, slug=slug)

    context = {
        'product': product
    }
    return render(request, 'store/product.html', context)

def category_detail(request, slug):
    category = get_object_or_404(Category, slug=slug)
    products = category.products.all()

    context = {
        'category': category,
        'products': products
    }

    return render(request, 'store/category_detail.html', context)
    enter code here

urls.py

from django.urls import path

from . import views
from .views import product_detail, category_detail

urlpatterns = [
    # Leave as empty string for base url
    path('', views.store, name="store"),
    path('cart/', views.cart, name="cart"),
    path('checkout/', views.checkout, name="checkout"),

    path('update_item/', views.updateItem, name="update_item"),
    path('process_order/', views.processOrder, name="process_order"),


    path('<slug:category_slug>/<slug:slug>/', product_detail, name='product-detail'),
    path('<slug:slug>/', category_detail, name='category_detail')

]

models.py

这里我用外键链接类别和产品

class Category(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, default=1)

    class Meta:
        verbose_name_plural = 'Categories'

    def __str__(self):
        return self.title


class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE, default=1)
    name = models.CharField(max_length=200)
    price = models.FloatField()
    digital = models.BooleanField(default=False, null=True, blank=True)
    image = models.ImageField(null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    slug = models.SlugField(max_length=255, default=1)



    def __str__(self):
        return self.name

    @property
    def imageURL(self):
        try:
            url = self.image.url
        except:
            url = ''
        return url

Reference

你的挑战来自于你使用 get_object_or_404 最好为你的详细视图做这样的事情:

def product_detail(request, category_slug, slug):
    product = Product.objects.get(slug=slug)

    context = {
        'product': product
    }
    return render(request, 'store/product.html', context)

问题出在 slug 字段上。以前,在 models.py 我有:

slug = models.SlugField(max_length=255, default=1)

我有产品和类别模型的 slug 字段。 Slug 就像产品的唯一 ID。之前我说过每次创建产品时,default=1。然而,这并不像您想象的那样独一无二。我的解决方案:

slug = models.SlugField(max_length=255, unique=True, default=uuid.uuid1)

我正在使用 unique=TrueUniversal Unique Identifier library

希望对您有所帮助。欢迎留下任何评论