Ошибка при использовании 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})