Existe uma maneira fácil de preencher SlugField de CharField?
Pergunta
class Foo(models.Model):
title = models.CharField(max_length=20)
slug = models.SlugField()
Existe um built-in maneira de obter o campo lesma para Preencher automaticamente com base no título? Talvez na administração e fora da administração.
Solução
para admin no Django 1.0 e acima, você precisa usar
prepopulated_fields = {'slug': ('title',), }
no seu admin.py
A sua chave no dicionário prepopulated_fields é o campo que deseja preenchido, eo valor é uma tupla de campos que deseja concatenadas.
Fora de administrador, você pode usar a função slugify
em seus pontos de vista. Em modelos, você pode usar o filtro |slugify
.
Há também esse pacote que vai cuidar disso automaticamente: https: //pypi.python .org / pypi / django-autoslug
Outras dicas
Fora do admin, consulte este django trecho . Coloque-o em sua .save()
, e ele vai trabalhar com objetos criados programaticamente. Dentro do admin, como os outros disseram, o uso prepopulated_fields
.
Para o pré-1.0:
slug = models.SlugField(prepopulate_from=('title',))
deve funcionar muito bem
Para 1.0, use camflan é
Você também pode usar o sinal django pre_save para fora lesma preenchimento de Django código de administrador. Consulte Django documentação sinais .
Ajax lesma singularidade validação será útil também, veja As-You-Type Slug Unicidade Validação @ Irrational Exuberance
autoslug tem funcionado muito bem para mim no passado. Embora eu nunca tentei usá-lo com o aplicativo de administração.
Thought I gostaria de acrescentar uma completa e resposta up-to-date com armadilhas mencionadas:
1. formulários de preenchimento automático em Django admin
Se você está apenas em causa sobre a adição e atualização de dados no admin, você pode simplesmente usar o prepopulated_fields atributo
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
admin.site.register(Article, ArticleAdmin)
2. formulários personalizados de preenchimento automático em modelos
Se você construiu sua própria interface disponível em servidor com formulários, você pode preencher automaticamente os campos usando o | slugify tamplate filtro ou o slugify utilidade quando salvar a forma (is_valid).
3. slugfields a nível da modelo com django-autoslug
Auto-povoandoAs soluções acima só irá preencher automaticamente o slugfield (ou qualquer campo) quando os dados são manipulados através dessas interfaces (o administrador ou um formulário personalizado). Se você tem uma API, comandos de gestão ou qualquer outra coisa que também manipula os dados que você precisa cair para nível modelo.
django-autoslug fornece os AutoSlugField-campos que se estende SlugField e permite que você set que o campo deve slugify ordenadamente:
class Article(Model):
title = CharField(max_length=200)
slug = AutoSlugField(populate_from='title')
Os usos de campo pre_save e sinais post_save para alcançar a sua funcionalidade por favor ver o texto pegadinha na parte inferior desta resposta.
4. Auto-preenchimento slugfields a nível da modelo, substituindo save ()
A última opção é implementar isso sozinho, que envolve substituir o padrão de salvamento método ():
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)
NOTA: massa atualizações irá ignorar o código (incluindo sinais)
Esta é uma miss-entendimento comum por iniciantes para Django. Primeiro você deve saber que os sinais pre_save e post_save estão diretamente relacionados com o save () - método. Em segundo lugar as diferentes maneiras de fazer a granel-updates no Django todos contornar o save () - método para atingir alta performance, operando diretamente sobre a camada de SQL. Isto significa que para o modelo exemplo utilizados em solução a 3 ou 4 acima:
- Article.objects.all (). Update (title = 'Novo post') não atualizar a lesma de qualquer artigo
- bulk_create ou bulk_update no modelo artigo NÃO atualizar a lesma de qualquer artigo.
- Uma vez que o save () -. Método não é chamado, há sinais pre_save ou post_save será emitido
Para fazer atualizações em massa e ainda utilizam restrições de nível de código a única solução é iterar objetos, um por um e chamar seu save () - método, que tem drasticamente menor desempenho do que operações em massa em nível de SQL. Você poderia naturalmente gatilhos usar em seu banco de dados, no entanto, que é um assunto totalmente diferente.