Создание ЧПУ используя slug во фреймворке Python Django


16 июня 2020


Создание человеко понятных URL в Python Django со slug

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

 

Регистрация в 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.

Создание ЧПУ в Django 3 с использованием prepopulated_fields

Повторное редактирование заголовка у созданной новости не будет изменять slug.

...

Теги: #python #django


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.