J'essaie de créer un SlugField
dans Django.
J'ai créé ce modèle simple:
from django.db import models
class Test(models.Model):
q = models.CharField(max_length=30)
s = models.SlugField()
Je fais ensuite ceci:
>>> 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'
J'attendais b-b-b-b
.
python
django
django-models
slug
Johnd
la source
la source
def save(self):
pardef save(self, *args, **kwargs):
afin d'éviter que des erreurs ne soient lancées lors de l'écriture de quelque chose commetest.objects.create(q="blah blah blah")
.slugify()
peut également être trouvé dansdjango.utils.text.slugify
, pas clair quand cela a été ajouté.Il y a un cas d'angle avec quelques caractères utf-8
Exemple:
Cela peut être résolu avec Unidecode
la source
Une petite correction à la réponse de Thepeer: Pour remplacer la
save()
fonction dans les classes de modèle, il vaut mieux y ajouter des arguments:Sinon,
test.objects.create(q="blah blah blah")
cela entraînera uneforce_insert
erreur (argument inattendu).la source
return super(test, self).save(*args, **kwargs)
. Je pense que cette méthode revientNone
, et je ne connais aucun plan pour changer cela, mais cela ne fait pas de mal de retourner ce que fait la méthode de la superclasse au cas où elle changerait dans le futur.Si vous utilisez l'interface d'administration pour ajouter de nouveaux éléments de votre modèle, vous pouvez configurer un
ModelAdmin
dans votreadmin.py
et utiliserprepopulated_fields
pour automatiser la saisie d'un slug:Ici, lorsque l'utilisateur entre une valeur dans le formulaire d'administration pour le
name
champ, leslug
sera automatiquement rempli avec le bon slugifiedname
.la source
slug
etname
ont des traductions. Comment puis-je faire cela avec des traductions? Parce que j'ai essayé d'ajouter'slug_en':('name_en',)
et obtenu l'erreur que l'attribut n'existe pas dans mon modèle.Dans la plupart des cas, le slug ne devrait pas changer, donc vous ne voulez vraiment le calculer qu'au premier enregistrement:
la source
Utilisez
prepopulated_fields
dans votre classe d'administration:la source
Si vous ne souhaitez pas définir le champ slug sur Non modifiable, je pense que vous souhaiterez définir les propriétés Null et Blank sur False. Sinon, vous obtiendrez une erreur lors de la tentative d'enregistrement dans Admin.
Une modification de l'exemple ci-dessus serait donc:
la source
J'utilise Django 1.7
Créez un SlugField dans votre modèle comme ceci:
Ensuite,
admin.py
définissezprepopulated_fields
;la source
Vous pouvez consulter la documentation pour
SlugField
en savoir plus à ce sujet de manière plus descriptive.la source