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})
Вернуться на верх