Django slug с id в url
Как сделать url с slug
и id
, например:
https://example.com/product/beauty-slug/1
Модель Product
может принимать повторяющийся продукт title
, и вместо использования unique slug
я предпочитаю использовать slug
с id
models.py
class Product(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
product_title = models.CharField(max_length=255, default='product_title')
slug = models.SlugField(max_length=250,unique=True,null=True)
def __str__(self):
return self.product_title
def get_absolute_url(self):
return reverse('product_change', kwargs={'slug': self.slug})
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.product_title)
return super().save(*args, **kwargs)
И как использовать его в template
product_list.html
<a href="{% url 'product_view' product.slug %}">see product</a>
urls.py
...
path('product/<slug:slug>', ProductView.as_view(), name='product_view'),
...
Это работает, но я знаю, что у меня будут одинаковые названия продуктов, поэтому я думаю, что id
лучше для моего случая, потому что при необходимости потребитель может сослаться на заказ продавцу с помощью номера id
...
В качестве пути вы можете использовать:
path('product/<slug:slug>/<int:pk>/', ProductView.as_view(), name='product_view'),
Таким образом, вы можете ссылаться на URL с помощью:
<a href="{% url 'product_view' product.slug product.pk %}">see product</a>
Если вы также обновите шаблон URL product_change
, метод .get_absolute_url()
[Django-doc] модели должен быть переписан так:
class Product(models.Model):
# …
def get_absolute_url(self):
return reverse('product_change', kwargs={'slug': self.slug, 'pk': self.pk})