12. Как использовать поле slug в django для большей читабельности?¶
Slug — это часть URL, которая идентифицирует конкретную страницу на сайте в форме, доступной для чтения пользователями. Для того чтобы это работало, django предлагает нам slugfield. Оно может быть реализовано следующим образом. У нас уже есть модель Article , мы добавим к ней slugfield, чтобы сделать ее читабельной для пользователей.:
from django.utils.text import slugify class Article(models.Model): headline = models.CharField(max_length=100) . . . slug = models.SlugField(unique=True) def save(self, *args, **kwargs): self.slug = slugify(self.headline) super(Article, self).save(*args, **kwargs) . . . >>> u1 = User.objects.get(id=1) >>> from datetime import date >>> a1 = Article.objects.create(headline="todays market report", pub_date=date(2018, 3, 6), reporter=u1) >>> a1.save() // slug here is auto-generated, we haven't created it in the above create method. >>> a1.slug 'todays-market-report'
Слизь полезна, потому что:
он дружелюбен к человеку (например, /blog/ вместо /1/).
хорошим SEO является создание последовательности в заголовке, рубрике и URL.
Обьясните зачем нужны slugfield в django?

Например у тебя есть статьи на сайте. И ты хочешь ссылки вида /pages/novaya-statya/ , статья называется НОВАЯ СТАТЬЯ, а ссылка novaya-statya. Вот для этого и нужны. Кстати, посмотри еще, что в идеале они (слагфилды) должны быть уникальны.
Ответ написан более трёх лет назад
Комментировать
Нравится 3 Комментировать
Slug поле — помогите разобраться?
Имею класс телефоны, где есть поля — id , name , price , image , release_date и slug . Задание такое:
Значение поля slug должно устанавливаться слагифицированным значением поля name.
Не могу понять что от меня хотят и как это можно реализовать?
Отслеживать
7,797 13 13 золотых знаков 25 25 серебряных знаков 55 55 бронзовых знаков
задан 20 мар 2022 в 18:43
Саша Прохоренко Саша Прохоренко
59 6 6 бронзовых знаков
От вас хотят, чтобы из имени «Вася Пупкин» получался slug «vasya-pupkin»
20 мар 2022 в 18:49
Вам нужна эта функция docs.djangoproject.com/en/4.0/ref/utils/…
20 мар 2022 в 22:36
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Из документации Slug — это газетный термин, это короткая метка для чего-то, содержащая только буквы, цифры, нижние подчеркивания и дефисы. Они в основном используются для URL ов.
Я предполагаю, что этот класс находится в файле models.py вашего приложения. Если это так, то для того чтоб выполнить задание необходимо просто добавить поле, которое будет SlugField . Что нибудь такое
from django.db import models class Phone(models.Model): name = models.CharField(max_length= 254, null=False) . slug = models.SlugField(max_length = 200)
Если не указывать входной параметр db_column для поля SlugField , то автоматически будет использовать значение из поля name , что вам и требуется.
Slugfield django что это
![]()
Django База [2023]: Автоматическое формирование slug, обработка кириллицы в Django #9
07 января 2023
Оценки статьи
Еще никто не оценил статью
В данном уроке мы научимся работать со slug в Django 4.1, а именно форматировать их автоматически, а также обрабатывать кириллицу в slugField.
Если вы хотите выразить благодарность автору сайта, статей и курса по Django, вы можете сделать это по ссылке ниже:
Что такое Slug?
slug — это тип поля в Django для создания человеко-понятных URL на латинице. С помощью slug мы можем автоматически конвертировать нашу запись, например с заголовком: Добро пожаловать на сайт. В url типа: dobro-pozhalovat-na-sajt.
Есть 2 способа конвертации заголовка в slug, но один работает лишь внутри административной модели, а другой работает всегда. Верно будет использовать оба варианта.
Настройка формирования slug в административной панели
Перейдем в файл admin.py в нашем приложении блог, и изменим код с этого:
blog/admin.py
from django.contrib import admin from mptt.admin import DraggableMPTTAdmin from .models import Category, Article @admin.register(Category) class CategoryAdmin(DraggableMPTTAdmin): """ Админ-панель модели категорий """ list_display = ('tree_actions', 'indented_title', 'id', 'title', 'slug') list_display_links = ('title', 'slug') prepopulated_fields = 'slug': ('title',)> admin.site.register(Article)
blog/admin.py
from django.contrib import admin from mptt.admin import DraggableMPTTAdmin from .models import Category, Article @admin.register(Category) class CategoryAdmin(DraggableMPTTAdmin): """ Админ-панель модели категорий """ list_display = ('tree_actions', 'indented_title', 'id', 'title', 'slug') list_display_links = ('title', 'slug') prepopulated_fields = 'slug': ('title',)> @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): prepopulated_fields = 'slug': ('title',)>
Пояснение:
- Мы добавили параметр prepopulated_fields , который позволяет с помощью JS обрабатывать заголовок в реальном времени, конвертирует даже кириллицу.
Смотрим результат в админ-панели:

Отлично, все работает. Теперь перейдем ко второму способу.
Добавление функции для сохранения уникального slug, обработка кириллицы с помощью python
Для обработки кириллицы в slug, нужно модернизировать функцию slugify() , для этого установим пакет pytils с помощью терминала: pip install pytils
Результат установки:
(venv) PS C:\Users\Razilator\Desktop\Base\backend> pip install pytils Collecting pytils Using cached pytils-0.4.1-py3-none-any.whl Installing collected packages: pytils Successfully installed pytils-0.4.1 [notice] A new release of pip available: 22.3 -> 22.3.1 [notice] To update, run: python.exe -m pip install --upgrade pip
Отлично, теперь я создам папку services в папке modules, а внутри два файла init.py и utils.py.
init.py необходим для инициализации папки как пакета Python.
В файл utils.py мы будем добавлять различные полезные функции для нашего проекта, поэтому мы ее отделим от приложения блог. Лично для меня это удобно, декомпозиция это всегда хорошо.
Теперь напишем функцию:
services/utils.py
from uuid import uuid4 from pytils.translit import slugify def unique_slugify(instance, slug): """ Генератор уникальных SLUG для моделей, в случае существования такого SLUG. """ model = instance.__class__ unique_slug = slugify(slug) while model.objects.filter(slug=unique_slug).exists(): unique_slug = f'unique_slug>-uuid4().hex[:8]>' return unique_slug
Добавление services в INSTALLED_APPS
Далее необходимо добавить наш созданный модуль services в приложения конфигурации Django.
backend/settings.py
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'modules.blog.apps.BlogConfig', 'modules.services', ]
Применение уникальных авто-слагов в модели Django
Отлично, функцию написали и модуль добавили в установленные приложения, теперь функцию unique_slugify() необходимо применить в модели Article (Статей).
Для этого переходим в blog/models.py и добавим работу функции при сохранении экземпляра модели.
blog/models.py
from django.db import models from django.core.validators import FileExtensionValidator from django.contrib.auth import get_user_model from django.urls import reverse from mptt.models import MPTTModel, TreeForeignKey from modules.services.utils import unique_slugify class Article(models.Model): """ Модель постов для сайта """ STATUS_OPTIONS = ( ('published', 'Опубликовано'), ('draft', 'Черновик') ) title = models.CharField(verbose_name='Заголовок', max_length=255) slug = models.CharField(verbose_name='Альт.название', max_length=255, blank=True, unique=True) # Другие поля. # Другие функции. def __str__(self): return self.title def get_absolute_url(self): return reverse('articles_detail', kwargs='slug': self.slug>) def save(self, *args, **kwargs): """ Сохранение полей модели при их отсутствии заполнения """ if not self.slug: self.slug = unique_slugify(self, self.title) super().save(*args, **kwargs)
Пояснение:
Мы импортировали функцию по генерации slug, а также добавили метод save для обработки полей экземпляра. В условии, если нет slug, то мы генерируем slug из заголовка, а если такой slug существует, то мы добавляем символы uuid4.
Давайте протестируем нашу функцию:

Отлично, у нас все получилось!
Меню категорий
-
Загрузка категорий.