Eu estou tentando criar um SlugField
no Django.
Eu criei este modelo simples:
from django.db import models
class Test(models.Model):
q = models.CharField(max_length=30)
s = models.SlugField()
Eu então faço isso:
>>> from mysite.books.models import Test
>>> t=Test(q="aa a a a", s="b b b b")
>>> t.s
'b b b b'
>>> t.save()
>>> t.s
'b b b b'
Eu estava esperando b-b-b-b
.
python
django
django-models
slug
Johnd
fonte
fonte
def save(self):
pordef save(self, *args, **kwargs):
para evitar que erros ocorram ao escrever algo parecidotest.objects.create(q="blah blah blah")
.slugify()
também pode ser encontrado emdjango.utils.text.slugify
, não está claro quando isso foi adicionado.Há uma caixa de canto com alguns caracteres utf-8
Exemplo:
Isso pode ser resolvido com o Unidecode
fonte
Uma pequena correção na resposta de Thepeer: Para substituir a
save()
função nas classes de modelo, adicione melhor argumentos a ela:Caso contrário,
test.objects.create(q="blah blah blah")
resultará em umforce_insert
erro (argumento inesperado).fonte
return super(test, self).save(*args, **kwargs)
. Acho que esse método retornaNone
, e não conheço nenhum plano para mudar isso, mas não faz mal retornar o que o método da superclasse faz caso ele mude em algum momento no futuro.Se você estiver usando a interface administrativa para adicionar novos itens ao seu modelo, poderá configurar um
ModelAdmin
no seuadmin.py
e utilizarprepopulated_fields
para automatizar a entrada de uma lesma:Aqui, quando o usuário digitar um valor no formulário de administrador para o
name
campo,slug
ele será preenchido automaticamente com o slugified corretoname
.fonte
slug
ename
têm traduções. Como posso fazer isso com traduções? Porque eu tentei adicionar'slug_en':('name_en',)
e obtive o erro de que esse atributo não existe no meu modelo.Na maioria dos casos, a lesma não deve mudar; portanto, você realmente deseja calculá-la apenas no primeiro salvamento:
fonte
Use
prepopulated_fields
na sua classe de administrador:fonte
Se você não deseja definir o campo slug como Não pode ser editável, acredito que deseje definir as propriedades Null e Blank como False. Caso contrário, você receberá um erro ao tentar salvar no Admin.
Portanto, uma modificação no exemplo acima seria:
fonte
Estou usando o Django 1.7
Crie um SlugField no seu modelo como este:
Então em
admin.py
defineprepopulated_fields
;fonte
Você pode consultar os documentos para
SlugField
saber mais sobre isso de maneira mais descritiva.fonte