Django - тот же slug, но с другим URL-путем
Я делаю сайт документации для самостоятельного хостинга для себя, изучая Django в то же время. Я нахожусь на этапе, когда начинаю наполнять сайт.
Мне интересно, есть ли возможность иметь два сообщения, которые имеют одинаковый slug, но относятся к разным категориям.
Например, у меня есть два поста с названием «вирус». Один из них относится к категории «информатика», а другой - к категории «здравоохранение».
На сайте эти страницы будут связаны следующим образом:
.../healthcare/virus/
.../computer-science/virus/
Есть ли способ использовать один и тот же slug в зависимости от значения другого поля (например, поля категории) или другая техника?
TIA
У вас могут быть повторяющиеся модули, если они уникальны в своих соответствующих категориях. Лучший способ справиться с этим в Django - обеспечить уникальность на уровне базы данных, используя ограничение unique_together
.
В конечном итоге вы можете переопределить метод save()
, чтобы автоматически генерировать пули, если существуют дубликаты:
from django.db import models
from django.utils.text import slugify
class Category(models.Model):
name = models.CharField(max_length=255, unique=True)
slug = models.SlugField(unique=True)
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=255)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
slug = models.SlugField(max_length=255)
# Other fields ...
class Meta:
# Your Meta here ...
constraints = [
models.UniqueConstraint(fields=['slug', 'category'], name='unique_slug_per_category')
]
def save(self, *args, **kwargs):
# Generate a slug if it's not set
if not self.slug:
base_slug = slugify(self.title)
self.slug = base_slug
count = 1
while Post.objects.filter(slug=self.slug, category=self.category).exists():
self.slug = f"{base_slug}-{count}"
count += 1
super().save(*args, **kwargs)
def __str__(self):
return f"{self.category.name} - {self.title}"
Таким образом, каждая запись привязана к определенной категории, а ограничение Unique гарантирует, что один и тот же фрагмент не может быть повторен в пределах одной и той же категории. Наконец, метод save()
генерирует slug из заголовка, если он не указан (он также проверяет, существует ли дубликат, добавляя номер (slug-1, slug-2 и т.д.), чтобы сделать его уникальным).
URL-адреса могут быть определены следующим образом:
urlpatterns = [
path('<slug:category_slug>/<slug:slug>/', YourView.as_view(), name='post-detail'),
]
Надеюсь, это помогло