Slug - это тип поля в Django для создания понятных URL на латинице. С помощью его мы можем автоматически конвертировать нашу запись, например с заголовком:
Понятный URL! на латинице |
В запись типа:
ponyatnyj-url-na-latinice
В этой статье будет рассмотрен пример автоматического создания такой возможности.
Создание модели
В модели обязательно должно находится текстовое поле, на которое будет создаваться slug. В основном это тег "<title>" или "<h1>". Для примера моя модель в models.py выглядит так:
from django.db import models
class News(models.Model):
title = models.CharField(max_length=80, null=False)
slug = models.SlugField(max_length=70)
# Возврат понятного отображения заголовка в панель администрирования
def __str__(self):
return self.title
Если не указать максимальную длину поля для SlugField, то оно будет равно 50. По умолчанию, для SlugField создается не кластерный индекс так как "db_index=True".
При этом вы не сможете создать ЧПУ на основе полей: DateTimeField, ForeignKey, OneToOneField, ManyToManyField.
Если есть вероятность того, что поле для создания slug может дублироваться - лучше установить требование к уникальности так как по умолчанию этого не делается:
slug = models.SlugField(max_length=70, unique=True)
Не забудьте выполнить миграцию:
python3 manage.py makemigrations
python3 manage.py migrate
Создание первого приложения во фреймворке Python Django 3
Регистрация в admin.py
В файле admin.py мы регистрируем нашу модель для отображения в панели администрирования через атрибут 'prepopulated_fields'. Мой 'slug' будет основан на 'title':
from django.contrib import admin
from .models import News
class PostAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('title',)}
admin.site.register(News, PostAdmin)
Теперь, при заполнении заголовка в панели администрирования будет срабатывать JavaScript конвертирующий кириллицу в ASCII.
Повторное редактирование заголовка у созданной новости не будет изменять slug.
...