Ошибка при использовании queryset get_absolute_urls Django

django.urls.exceptions.NoReverseMatch: Reverse for 'detail' with keyword arguments '{'slug': 'test'}' not found. 1 pattern(s) tried: ['detail<slug:slug/\\Z']

Я пытаюсь создать деталь продукта, фильтруя его по slug (возможно, это может быть ID), поэтому я решил отправить slug через URL и затем фильтровать продукт по указанному slug, но у меня возникают проблемы с реализацией этого (мой другой get_absolute_url работает, но этот я не могу исправить).

models.py:

class Product(models.Model):
    name = models.CharField(max_length=255, unique=False, blank=True)
    slug = models.SlugField(unique=True)
    category = models.ForeignKey(
        Category, on_delete=models.CASCADE, unique=False)
    subcategory = models.ForeignKey(
        SubCategory, on_delete=models.CASCADE, unique=False, blank=True, null=True)
    short_description = models.CharField(
        max_length=255, unique=False, blank=True, null=True)
    long_description = models.TextField(unique=False, blank=True, null=False)
    image = models.ImageField(blank=True, null=True, unique=False)
    on_promotion = models.BooleanField(default=False)

    def __str__(self):
        return self.slug

    def get_absolute_url(self):
        return reverse("product:detail", kwargs={"slug": self.slug})

urls.py:

urlpatterns = [
    path('', views.index, name="index"),
    path('detail<slug:slug/', views.ProductDetail.as_view(), name="detail"),

    path('category-<int:category_id>/', views.category, name="category"),
    path('category-<int:category_id>/subcategory-<int:subcategory_id>',
         views.subcategory, name="subcategory")
]

views.py """

def detail(request, product_id):
    product = Product.objects.get(product_id)
    return render(request, 'product/detail.html', {'product_id': product})
"""


class ProductDetail(DetailView):
    template_name = 'product/detail.html'
    # queryset = Product.available.all()

    def get_queryset(self):
        queryset = Product.available.filter(slug=self.kwargs.get("slug"))
        return queryset

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

Шаблон:

<a href="{{product.get_absolute_url}}">aaa</a>

Думаю, вам нужно убрать product: в методе get_absolute_url. Если вам нужно добавить пространство имен приложения (чего в вашем случае не требуется), вы должны использовать аргумент current_app, как указано здесь: https://docs.djangoproject.com/en/4.1/topics/http/urls/#topics-http-reversing-url-namespaces

В дополнение к вышесказанному, вы также можете использовать {% url 'detail' product.slug %}

path('detail<slug:slug/', views.ProductDetail.as_view(), name="detail"),

путь неправильный, вы забыли поставить закрывающий > после slug

'detail<slug:slug>/'

и я не уверен, написали ли вы app_name = "product" или нет в urls.py

я не уверен в вашем основном urls.py, но я знаю: для использования именованных урлов, сопряженных с ':', вы должны предоставить url-namespace.

https://docs.djangoproject.com/en/4.1/topics/http/urls/#url-namespaces

пожалуйста, проверьте в настройках - основные urls.py:

path('products', include('products.urls', namespace='products))

После этого вы можете использовать:

def get_absolute_url(self):
        return reverse("products:detail", current_app=self.request.resolver_match.namespace, kwargs={"slug": self.slug})

В вашем случае следует опустить 'product:'

def get_absolute_url(self):
   return reverse('detail', kwargs={"slug": self.slug})
Вернуться на верх