Django Ошибка NoReverseMatch: Как сгенерировать урлы для каждой модели

Я столкнулся с ошибкой NoReverseMatch в своем Django-приложении при попытке сгенерировать URL для страниц с подробным описанием товара. Сообщение об ошибке указывает, что шаблон URL для 'product-detail' с указанными pk и slug не найден. Вот детали моей установки:

NoReverseMatch at /earrings
Обратный запрос для 'product-detail' с аргументами '('', ''')' не найден. Проверено 1 шаблон(ов): ['product/(?P[0-9]+)/(?P[-a-zA-Z0-9_]+)/\Z']

Модель:

class Product(models.Model):
    name = models.CharField(max_length=400)
    price = models.IntegerField(default=0)
    description = RichTextField(null=True, blank=True)
    slug = models.SlugField(unique=True, null=True, blank=True, max_length=400)
    create_at = models.DateTimeField(null=True, blank=True)
    id = models.AutoField(primary_key=True)
    
    def get_absolute_url(self):
        return reverse('product-detail', kwargs={'pk': self.pk, 'slug': self.slug})
    
    def __str__(self):
        return f'{self.name}'

Вид:

class ProductDetailView(DetailView):
    model = Product
    template_name = 'tehApp/product_detail.html'
    context_object_name = 'product'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['Products'] = Product.objects.all()
        return context
    
    def get_object(self):
        return get_object_or_404(Product, pk=self.kwargs['pk'], slug=self.kwargs['slug'])

URL:

urlpatterns = [
    path('product/<int:pk>/<slug:slug>/', ProductDetailView.as_view(), name='product-detail'),
]

Шаблон:

{% for product in products %}
<div class="item" data-name="{{ product.name }}" data-price="{{ product.price }}" data-date="{{ product.create_at|date:"Y-m-d\TH:i:s" }}">
        <div class="relative">
            <div class="relative thumbnail">
                {% with images=product.images.all %}
                    {% if images|length > 0 %}
                        <a href="{% url 'product-detail' product.pk product.slug %}">
                            <img width="250px" height="250px" class="" src="{{ images.0.image.url }}" alt="">
                        </a>
                    {% endif %}
                    {% if images|length > 1 %}
                        <img width="100%" height="100%" class="hidden" src="{{ images.1.image.url }}" alt="">
                    {% endif %}
                {% endwith %}
                <a href="{% url 'product-detail' product.pk product.slug %}" class="absolute top-0 w-full h-full bg-transparent"></a>
                <div class="hidden quickaddtocart">Add to Cart</div>
            </div>
            <p class="caption"><a href="{% url 'product-detail' product.pk product.slug %}">{{ product.name }}</a></p>
            <div class="caption-price">${{ product.price }}</div>
        </div>
</div>
{% endfor %}

Пожалуйста, задавайте дополнительные вопросы, если это необходимо, Любая помощь или понимание будут высоко оценены!

Что я пробовал:
Я попробовал сгенерировать URL для страниц с подробным описанием товара в моем Django-приложении с помощью шаблонного тега {% url 'product-detail' product.pk product.slug %}. Это должно создать URL на основе pk (первичного ключа) и slug каждого экземпляра Product.

Что я ожидал:
Я ожидал, что URL будут сгенерированы корректно и будут ссылаться на детальные страницы каждого товара, где product.pk и product.slug будут подставлены в шаблон URL.

Что получилось в результате:
Вместо генерации корректных URL-адресов я столкнулся с ошибкой NoReverseMatch с сообщением:

NoReverseMatch at /earrings
Обратный запрос для 'product-detail' с аргументами '('', ''')' не найден. Проверено 1 шаблон(ов): ['product/(?P[0-9]+)/(?P[-a-zA-Z0-9_]+)/\Z']

Эта ошибка указывает на то, что шаблон URL для product-detail не может быть сопоставлен, поскольку он получил пустые значения pk и slug. Шаблон URL ожидает непустых значений pk и slug.

вы обеспечиваете context['Products'] = Product.objects.all() в файле views.py.

но вы используете {% for product in products %} в шаблоне.

{% for product in Products %} нужно.

Решено, спасибо.

Это произошло из-за того, что я заполнил супер с Product и self. Он должен был быть пустым

class ProductDetailView(DetailView):
    template_name = 'nasipWeb/product_detail.html'
    model = Product
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['Bar'] = Bar.objects.first()
        return context
    
    def get_object(self):
        return get_object_or_404(Product, pk=self.kwargs['pk'])

Да, теперь все работает, я благодарен всем за помощь

Вернуться на верх