Есть ли простой способ заполнить SlugField из CharField? - PullRequest
33 голосов
/ 26 сентября 2008
class Foo(models.Model):
    title = models.CharField(max_length=20)
    slug = models.SlugField()

Существует ли встроенный способ автоматического заполнения поля слагов на основе заголовка? Возможно в Админе и вне Админа.

Ответы [ 6 ]

61 голосов
/ 26 сентября 2008

для администратора в Django 1.0 и выше, вам нужно будет использовать

prepopulated_fields = {'slug': ('title',), }

в вашем admin.py

Ваш ключ в словаре prepopulated_fields - это поле, которое вы хотите заполнить, а значение - это набор полей, которые вы хотите объединить.

Вне администратора вы можете использовать функцию slugify в своих представлениях. В шаблонах вы можете использовать фильтр |slugify.

Существует также этот пакет, который позаботится об этом автоматически: https://pypi.python.org/pypi/django-autoslug

6 голосов
/ 27 сентября 2008

Вне админа, смотрите этот фрагмент django . Поместите его в .save(), и он будет работать с объектами, созданными программно. Внутри админа, как уже говорили другие, используйте prepopulated_fields.

3 голосов
/ 26 сентября 2008

Для pre-1.0:

slug = models.SlugField(prepopulate_from=('title',))

должно работать просто отлично

Для 1.0 используйте camflan's

2 голосов
/ 30 сентября 2008

Вы также можете использовать сигнал pre_save django, чтобы заполнить слаг за пределами кода администратора django. См. Документация по сигналам Джанго .

Также будет полезна проверка уникальности слага Ajax, см. Проверка уникальности слизняка по типу @ нерациональное изобилие

0 голосов
/ 20 апреля 2019

Думаю, я бы добавил полный и актуальный ответ с указанием ошибок:

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

0 голосов
/ 19 сентября 2011

autoslug работал довольно хорошо для меня в прошлом. Хотя я никогда не пытался использовать его с приложением администратора.

...