Подтвердить что ты не робот

Есть ли простой способ заполнить SlugField от CharField?

class Foo(models.Model):
    title = models.CharField(max_length=20)
    slug = models.SlugField()

Есть ли встроенный способ получить поле пули для автопопуляции на основе заголовка? Возможно, в Admin и вне Admin.

4b9b3361

Ответ 1

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

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

в вашем admin.py

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

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

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

Ответ 2

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

Ответ 3

Для pre-1.0:

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

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

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

Ответ 5

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

Ответ 6

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

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)

ПРИМЕЧАНИЕ: массовые обновления будут обходить ваш код (включая сигналы)

Это распространенное недоразумение новичков в Django. Сначала вы должны знать, что сигналы pre_save и post_save напрямую связаны с save() -method. Во-вторых, различные способы массовых обновлений в Django обходят save() -method для достижения высокой производительности, работая непосредственно на уровне SQL. Это означает, что для примера модели, использованной в решении 3 или 4 выше:

  • Article.objects.all(). Update (title= 'New post') НЕ будет обновлять слаг любой статьи
  • Использование bulk_create или bulk_update в модели Article НЕ будет обновлять слаг любой статьи.
  • Поскольку save() -method не вызывается, никакие сигналы pre_save или post_save не будут отправляться.

Чтобы выполнять массовые обновления и при этом использовать ограничения на уровне кода, единственное решение состоит в том, чтобы перебирать объекты один за другим и вызывать функцию save() -method, которая имеет значительно меньшую производительность, чем массовые операции уровня SQL. Конечно, вы можете использовать триггеры в своей базе данных, хотя это совершенно другая тема.