python Django NoReverseMatch 错误 product_detail.html

python Django NoReverseMatch error to product_detail.html

我的 product.html 工作正常,但是当我单击 link 将我带到 product_detail.html 时,我不断收到 NoReverseMatch 错误。我在下面保留了您需要帮助我的所有内容。如果你们中的任何人帮助我,我将不胜感激,因为我在这个错误中停留了 2 天。

我的Django文件夹结构如下

src/urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'', include('main.urls')),
    url(r'contact/', include('contact.urls')),
    url(r'product/', include('product.urls')),
]

product/urls

urlpatterns = [
    url(r'^$', product, name='product'),
    path('<slug:slug>/', ProductDetail.as_view(), name='product_detail'),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

product/models.py

class Products(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    product_image = models.ImageField(upload_to='images/uploaded/products')
    product_title = models.CharField(max_length=200)
    product_description = models.TextField(max_length=1000)

    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='products')
    published = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.IntegerField(choices=STATUS, default=0)

    def __str__(self):
        return self.title

product/views.py

    def product(request):
        products = Products.objects.all().order_by("-id")
        page = request.GET.get('page', 1)
    
        paginator = Paginator(products, 6)
        try:
            products = paginator.page(page)
        except PageNotAnInteger:
            products = paginator.page(1)
        except EmptyPage:
            products = paginator.page(paginator.num_pages)
        context = {
            'products': products
        }
        return render(request, 'products.html', context)
    
    class ProductDetail(generic.DetailView):
        model = Products
        template_name = 'products_detail.html'

product.html

{% for p in products %}
            <div class="mb-4 mb-lg-4 col-sm-6 col-md-6 col-lg-4">
                <div class="block-service-1-card">
                    <a href="{% url 'product_detail' p.slug  %}" class="thumbnail-link d-block mb-4">
                        <img src="{{ p.product_image.url }}" alt="Image" class="img-fluid" style="height: 400px; width: 400px">
                    </a>
                    <h3 class="block-service-1-heading mb-3"><a href="{% url 'product_detail' p.slug  %}">
                    {{ p.product_title }}
                    </a></h3>
                    <div class="block-service-1-excerpt"><p>{{p.product_description|slice:":20" }}
                        <a href="{% url 'product_detail' p.slug  %}"
                           class="d-inline-flex align-items-center block-service-1-more"><span>Find out more</span>
                            <span
                                    class="icon-keyboard_arrow_right icon"></span></a></p></div>
                </div>
            </div>
            {% endfor %}

products_details.html

 <div class="block-service-1-card">
                    <a  class="thumbnail-link d-block mb-4"><img src="{{ p.product_image.url }}" alt="Image"
                                                                         class="img-fluid"></a>
                    <h3 class="block-service-1-heading mb-3"><a href="{% url 'product_detail' p.slug  %}"> {{
                        p.product_title }}</a></h3>
                    <div class="block-service-1-excerpt"><p>{{p.product_description }}</p></div>
                    </div>

得到的错误是

NoReverseMatch at /product/fadfa/
Reverse for 'product_detail' with arguments '('',)' not found. 1 pattern(s) tried: ['product/(?P<slug>[-a-zA-Z0-9_]+)/$']

请在您的 urls.py

urlpatterns = [
    url(r'^$', product, name='product'),
    path('<slug:title>/', ProductDetail.as_view(), name='product_detail'),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

在你的 html product.html

div class="mb-4 mb-lg-4 col-sm-6 col-md-6 col-lg-4">
                <div class="block-service-1-card">
                    <a href="{% url 'product_detail' request.Products.title %}" class="thumbnail-link d-block mb-4">
                        <img src="{{ p.product_image.url }}" alt="Image" class="img-fluid" style="height: 400px; width: 400px">
                    </a>
                    <h3 class="block-service-1-heading mb-3"><a href="{% url 'product_detail' p.slug  %}">
                    {{ p.product_title }}
                    </a></h3>

你尝试创建 ulrpattern 的方式对我来说并不是最好的方式 还要检查你的 html 文件名,因为你在你的 views.py 中提到了 product_detail.html 但我认为你将它命名为 product_details.html 正如你在这里写的那样

product_details.html 中,您没有与 products.html 中相同的循环,因此 p 在这种情况下是一个未知变量。

DetailView 提供 object 包含适当模型项的变量。

所以尝试将 product_details.html 中的所有 p.*** 更改为 object.***,例如

<a href="{% url 'product_detail' object.slug  %}" >