Думаю, я бы добавил полный и актуальный ответ с указанием ошибок:
1. Автозаполнение форм в Django Admin
Если вас интересует только добавление и обновление данных в администраторе, вы можете просто использовать атрибут prepopulated_fields
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
admin.site.register(Article, ArticleAdmin)
2. Автоматическое заполнение пользовательских форм в шаблонах
Если вы создали собственный серверный интерфейс с формами, вы можете автоматически заполнить поля, используя либо шаблонный шаблон | slugify , либо утилиту slugify при сохранении Форма (is_valid).
3. Автозаполнение слаг-полей на уровне модели с помощью django-autoslug
Приведенные выше решения будут автоматически заполнять поле слаг (или любое поле), когда данные обрабатываются через эти интерфейсы (администратор или пользовательская форма). Если у вас есть API, команды управления или что-то еще, что также манипулирует данными, которые вам нужно раскрыть на уровне модели.
django-autoslug предоставляет поля AutoSlugField, расширяющие SlugField и позволяющие вам установить, какое поле следует аккуратно слагать:
class Article(Model):
title = CharField(max_length=200)
slug = AutoSlugField(populate_from='title')
Поле использует сигналы pre_save и post_save для достижения своей функциональности, поэтому, пожалуйста, смотрите текст исправления внизу этого ответа.
4. Автоматическое заполнение полей слагов на уровне модели путем переопределения save ()
Последний вариант - реализовать это самостоятельно, что включает переопределение метода save () по умолчанию:
class Article(Model):
title = CharField(max_length=200)
slug = SlugField()
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Job, self).save(*args, **kwargs)
ПРИМЕЧАНИЕ: массовые обновления будут обходить ваш код (включая сигналы)
Это распространенное недоразумение новичков в Джанго. Прежде всего вы должны знать, что сигналы pre_save и post_save напрямую связаны с методом save (). Во-вторых, различные способы массовых обновлений в Django обходят метод save () для достижения высокой производительности, работая непосредственно на уровне SQL. Это означает, что для примера модели, использованной в решении 3 или 4 выше:
- Article.objects.all (). Update (title = 'New post') NOT обновит слаг любой статьи
- Использование bulk_create или bulk_update в модели Article позволит NOT обновить слаг любой статьи.
- Поскольку метод save () не вызывается, никакие сигналы pre_save или post_save не будут отправляться .
Чтобы выполнять массовые обновления и при этом использовать ограничения на уровне кода, единственное решение состоит в том, чтобы перебирать объекты один за другим и вызывать его метод save (), который имеет значительно меньшую производительность, чем массовые операции уровня SQL. Конечно, вы можете использовать триггеры в своей базе данных, хотя это совершенно другая тема.