NoReverseMatch在Django中具有2个子参数

时间:2019-02-04 14:53:23

标签: django

我有以下问题。

我想在此URL上有一个detailview:127.0.0.1:8000/<category-name>/<product-name>category-nameproduct-name是子域。)直接从索引页面开始。请帮助:(

我的错误:

NoReverseMatch at /products/ Reverse for 'ProductDetail' with arguments '('new-things', 'flower-pot')' not found. 1 pattern(s) tried: ['products\\/\\<slug\\:category\\.slug\\>\\/\\<slug\\:product\\.slug\\>$']

我(相关部分)index.html:

{% for p in Product %}
  <a href="{% url 'product:ProductDetail' p.category.slug p.slug %}">{{ p.name}}</a>
{% endfor %}

我的(相关部分)urls.py:

from .models import *

app_name = 'product'
urlpatterns = [
    path('product/<slug:category.slug>/<slug:product.slug>', views.ProductDetailView.as_view(), name="ProductDetail"),
]

和(相关部分)我的模型。py:

    class Product(models.Model):
        name = models.CharField(max_length=100)
        description = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
        slug = models.SlugField(blank=True, null=True)

            def save(self, *args, **kwargs):
                if not self.id:
                    # Newly created object, so set slug
                    self.slug = slugify(self.name)

                super(Product, self).save(*args, **kwargs)

            def __str__(self):
                return self.name


class Category(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    slug = models.SlugField(blank=True, null=True)

        def save(self, *args, **kwargs):
            if not self.id:
                # Newly created object, so set slug
                self.slug = slugify(self.name)

            super(Category, self).save(*args, **kwargs)

        def __str__(self):
            return self.name

2 个答案:

答案 0 :(得分:1)

在参数名称中使用点没有意义。使用下划线:

path('product/<slug:category_slug>/<slug:product_slug>', views.ProductDetailView.as_view(), name="ProductDetail"),

但是,当您尝试通过产品来引用类别时,这仍然无法真正起作用。但是您的模型在“产品”和“类别”之间没有任何关系。我假设您需要从Product到Category的ForeignKey。

答案 1 :(得分:0)

首先,Product模型没有category。将ForeignKey附加到您的Product模型中。

class Product(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    slug = models.SlugField(blank=True, null=True)
    category = models.ForeignKey('Category', on_delete=models.CASCADE) # change on_delete what you want.

        def save(self, *args, **kwargs):
            if not self.id:
                # Newly created object, so set slug
                self.slug = slugify(self.name)

            super(Product, self).save(*args, **kwargs)

        def __str__(self):
            return self.name

第二。您的网址设置有误。您不能在url参数中使用.。更改您的代码。

urlpatterns = [
    path('product/<slug:category_slug>/<slug:product_slug>', views.ProductDetailView.as_view(), name="ProductDetail"),
]