Найти тему

Автоматическое генерирование полей слаг в Django

В этой статье я поделюсь своим опытом создания модели в Django, которая автоматически генерирует значение поля "слаг" на основе заголовка статьи. Сначала разберем основные части кода и шаги, которые я предпринял для реализации этой функции.

1. Импорт необходимых библиотек и создание функции транслитерации

В начале кода мы импортируем необходимые библиотеки и создаем функцию для транслитерации кириллических символов в латиницу.

from django.db import models
from ckeditor.fields import RichTextField
from django.utils import timezone

TRANSLIT_DICT = {
    'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',
    'е': 'e', 'ё': 'e', 'ж': 'zh', 'з': 'z', 'и': 'i',
    'й': 'i', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n',
    'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't',
    'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'ts', 'ч': 'ch',
    'ш': 'sh', 'щ': 'sch', 'ъ': '', 'ы': 'y', 'ь': '',
    'э': 'e', 'ю': 'yu', 'я': 'ya',
    'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D',
    'Е': 'E', 'Ё': 'E', 'Ж': 'Zh', 'З': 'Z', 'И': 'I',
    'Й': 'I', 'К': 'K', 'Л': 'L', 'М': 'M', 'Н': 'N',
    'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T',
    'У': 'U', 'Ф': 'F', 'Х': 'H', 'Ц': 'Ts', 'Ч': 'Ch',
    'Ш': 'Sh', 'Щ': 'Sch', 'Ъ': '', 'Ы': 'Y', 'Ь': '',
    'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya'
}

def custom_slugify(text):
    transliterated_text = ''.join(TRANSLIT_DICT.get(c, c) for c in text)
    sanitized_text = transliterated_text.replace("'", "").replace('"', "").replace(',', '').replace(';', '').replace(':', '')
    return sanitized_text.replace(' ', '-').lower()

Объяснение:

  • TRANSLIT_DICT: Словарь для транслитерации кириллических символов в латинские.
  • custom_slugify: Функция, которая принимает строку, транслитерирует ее с помощью словаря и очищает от специальных символов. В конце она заменяет пробелы на дефисы и приводит строку к нижнему регистру.

2. Определение модели BlogNews

Модель BlogNews представляет собой структуру базы данных для хранения информации о статьях блога.

class BlogNews(models.Model):
    TitleBlogNews = models.CharField(max_length=250, verbose_name='Введите название статьи')
    SlugBlogNews = models.CharField(max_length=250, verbose_name='Заполняется автоматически', blank=True)
    ImgBlogNews = models.ImageField(upload_to='media/photos/blog/', verbose_name='Главное изображение')
    DataBlogNews = models.DateField()
    TextBlogNews = RichTextField(verbose_name='Контент записи')

def save(self, *args, **kwargs):
        if not self.SlugBlogNews:
            self.SlugBlogNews = custom_slugify(self.TitleBlogNews)
        super().save(*args, **kwargs)

def __str__(self):
        return self.TitleBlogNews

class Meta:
        verbose_name = 'Новость или пост'
        verbose_name_plural = 'Новости или посты'

Объяснение:

  • TitleBlogNews: Поле для заголовка статьи.
  • SlugBlogNews: Поле для слага, которое заполняется автоматически, если оно пустое. Это поле используется в URL для упрощения и улучшения SEO.
  • ImgBlogNews: Поле для загрузки изображения.
  • DataBlogNews: Поле для даты статьи.
  • TextBlogNews: Поле для контента статьи, используя CKEditor для форматирования.

Метод save переопределен для автоматической генерации слага, если оно еще не задано. Это достигается вызовом функции custom_slugify при сохранении записи.

3. Определение модели FormsFadbikePost

Модель FormsFadbikePost предназначена для хранения комментариев.

class FormsFadbikePost(models.Model):
    NameFadbike = models.CharField(max_length=250, verbose_name='Имя комментатора')
    EmailFadbike = models.EmailField(verbose_name='Email комментатора')
    DateFadbike = models.DateTimeField(default=timezone.now, verbose_name='Дата создания')
    MassageFadbike = models.TextField(verbose_name='Комментарий')

def __str__(self):
        return self.NameFadbike

class Meta:
        verbose_name = 'Комментарий'
        verbose_name_plural = 'Комментарии'

Объяснение:

  • NameFadbike: Имя комментатора.
  • EmailFadbike: Электронная почта комментатора.
  • DateFadbike: Дата и время создания комментария, устанавливается по умолчанию на текущее время.
  • MassageFadbike: Текст комментария.

Заключение

Таким образом, я научился автоматически генерировать поле "слаг" в Django, используя транслитерацию заголовка статьи и формируя SEO-дружественные URL. Этот подход упрощает создание уникальных и понятных URL для каждой статьи, что улучшает удобство работы с сайтом и его индексируемость в поисковых системах.