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.

Foi útil?

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-povoando

As 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top