В этой статье я поделюсь своим опытом создания модели в 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 для каждой статьи, что улучшает удобство работы с сайтом и его индексируемость в поисковых системах.