Existe uma maneira fácil de preencher SlugField de CharField?

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

Existe uma maneira interna para obter o campo lesma para Preencher automaticamente com base no título? Talvez na administração e fora da administração.

Publicado 26/09/2008 em 20:40
fonte usuário
Em outras línguas...                            


6 respostas

votos
58

por Admin dentro Django 1.0 e acima, você precisaria usar

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

em sua admin.py

A sua chave no dicionário prepopulated_fields é o campo que deseja preenchido, eo valor é uma tupla de campos que você quer concatenada.

Fora de admin, você pode usar a slugifyfunção em seus pontos de vista. Em modelos, você pode usar o |slugifyfiltro.

Há também esse pacote que vai cuidar disso automaticamente: https://pypi.python.org/pypi/django-autoslug

Respondeu 26/09/2008 em 20:51
fonte usuário

votos
6

Fora da administração, ver esse trecho Django . Coloque-o na sua .save(), e ele vai trabalhar com objetos criados programaticamente. Dentro do admin, como os outros disseram, use prepopulated_fields.

Respondeu 26/09/2008 em 21:59
fonte usuário

votos
4

Para o pré-1.0:

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

deve funcionar muito bem

Para 1.0, utilize camflan de

Respondeu 26/09/2008 em 20:44
fonte usuário

votos
2

Você também pode usar o sinal django pre_save para preencher lesma fora do código de administração do Django. Veja Django documentação sinais .

Ajax lesma validação singularidade será útil também, ver As-You-Type Slug Unicidade Validação @ exuberância irracional

Respondeu 30/09/2008 em 14:31
fonte usuário

votos
0

Pensei que eu gostaria de acrescentar uma completa e up-to-date resposta com armadilhas mencionadas:

1. formulários de preenchimento automático em Django admin

Se você está apenas preocupado sobre como adicionar e atualizar dados no admin, você pode simplesmente usar os prepopulated_fields atribuir

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

admin.site.register(Article, ArticleAdmin)

2. formulários personalizados Auto-preencher 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 filtro tamplate ou o slugify utilidade quando salvar o formulário (is_valid).

slugfields a nível da modelo com django-autoslug 3. 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 definir qual campo deve slugify ordenadamente:

class Article(Model):
    title = CharField(max_length=200)
    slug = AutoSlugField(populate_from='title')

O campo utiliza sinais pre_save e post_save para alcançar a sua funcionalidade por favor ver o texto pegadinha na parte inferior desta resposta.

4. Auto-preencher slugfields a nível da modelo, substituindo save ()

A última opção é implementar isso sozinho, que envolve substituindo 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 de exemplo utilizados em solução a 3 ou 4 acima:

  • Article.objects.all (). Update (title = 'Novo post') vai NÃO atualizar a lesma de qualquer artigo
  • Usando bulk_create ou bulk_update no artigo modelo irá NÃO atualizar a lesma de qualquer artigo.
  • Desde 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 de Uso naturalmente desencadeia em seu banco de dados, no entanto, que é um assunto totalmente diferente.

Respondeu 20/04/2019 em 09:47
fonte usuário

votos
0

autoslug tem funcionado muito bem para mim no passado. Embora eu nunca tentei usá-lo com o aplicativo de administração.

Respondeu 19/09/2011 em 13:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more