class Foo(models.Model):
title = models.CharField(max_length=20)
slug = models.SlugField()
Есть ли встроенный способ получить поле пули для автопопуляции на основе заголовка? Возможно, в Admin и вне Admin.
class Foo(models.Model):
title = models.CharField(max_length=20)
slug = models.SlugField()
Есть ли встроенный способ получить поле пули для автопопуляции на основе заголовка? Возможно, в Admin и вне Admin.
для Admin в Django 1.0 и выше, вам нужно будет использовать
prepopulated_fields = {'slug': ('title',), }
в вашем admin.py
Ваш ключ в словаре prepopulated_fields - это поле, которое вы хотите заполнить, а значение - кортеж полей, которые вы хотите объединить.
Вне администратора вы можете использовать функцию slugify
в своих представлениях. В шаблонах вы можете использовать фильтр |slugify
.
Существует также этот пакет, который позаботится об этом автоматически: https://pypi.python.org/pypi/django-autoslug
Вне администратора, см. этот фрагмент django. Поместите его в .save()
, и он будет работать с объектами, созданными программно. Внутри администратора, как говорили другие, используйте prepopulated_fields
.
Для pre-1.0:
slug = models.SlugField(prepopulate_from=('title',))
должен отлично работать
Для 1.0 используйте camflan's
Вы также можете использовать pre_save django signal для заполнения пули вне кода администратора django. См. Документация сигналов Django.
Валидация уникальности пустых строк Ajax также будет полезна, см. Валидация уникальности уникального исключения для всех типов @Irrational Exuberance
autoslug работал у меня в прошлом. Хотя я никогда не пробовал использовать его с помощью приложения admin.
Думаю, я бы добавил полный и актуальный ответ с указанием ошибок:
Если вас интересует только добавление и обновление данных в администраторе, вы можете просто использовать атрибут prepopulated_fields
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
admin.site.register(Article, ArticleAdmin)
Если вы создали свой собственный серверный интерфейс с формами, вы можете автоматически заполнять поля, используя | фильтр тамплат | slugify или утилиту slugify при сохранении формы (is_valid).
Вышеуказанные решения будут автоматически заполнять поле слаг (или любое поле), когда данные обрабатываются через эти интерфейсы (администратор или пользовательская форма). Если у вас есть API, команды управления или что-то еще, что также манипулирует данными, которые вам нужно выпустить на уровень модели.
django-autoslug предоставляет поля AutoSlugField, которые расширяют SlugField и позволяют вам указать, какое поле должно быть аккуратно слагать:
class Article(Model):
title = CharField(max_length=200)
slug = AutoSlugField(populate_from='title')
Поле использует сигналы pre_save и post_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 выше:
Чтобы выполнять массовые обновления и при этом использовать ограничения на уровне кода, единственное решение состоит в том, чтобы перебирать объекты один за другим и вызывать функцию save() -method, которая имеет значительно меньшую производительность, чем массовые операции уровня SQL. Конечно, вы можете использовать триггеры в своей базе данных, хотя это совершенно другая тема.