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'),
]

Надеюсь, это помогло

Вернуться на верх