240 votes

Comment crée-t-on une limace dans Django ?

Je suis en train de créer une SlugField en Django.

J’ai créé ce modèle simple :

J’ai ensuite procédez comme suit :

Je m’attendais à b-b-b-b

448voto

Buddy Points 3711

Vous aurez besoin d'utiliser la slugify fonction.

>>> from django.template.defaultfilters import slugify
>>> slugify("b b b b")
u'b-b-b-b'
>>>

Vous pouvez appeler slugify automatiquement en substituant l' save méthode:

class test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

    def save(self, *args, **kwargs):
        self.s = slugify(self.q)
        super(test, self).save(*args, **kwargs)

Sachez que la ci-dessus sera la cause de votre URL à changer lorsque l' q champ est modifié, ce qui peut provoquer la rupture de liens. Il peut être préférable de générer de la limace qu'une seule fois lorsque vous créez un nouvel objet:

class test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

    def save(self, *args, **kwargs):
        if not self.id:
            # Newly created object, so set slug
            self.s = slugify(self.q)

        super(test, self).save(*args, **kwargs)

113voto

DooBLER Points 320

Il est affaire d’angle avec certains caractères utf-8

Exemple :

Cela peut être résolu avec Unidecode

69voto

Dingle Points 902

Une petite correction à la réponse de Thepeer : pour substituer save() fonctionne dans les classes de modèle, mieux y ajouter arguments :

Sinon, test.objects.create (q = "blah blah blah") provoque une erreur de force_insert (argument inattendu).

31voto

henrym Points 1516

Si vous utilisez l’interface d’administration pour ajouter de nouveaux éléments de votre modèle, vous pouvez configurer un ModelAdmin pour cela dans votre ' admin.py ', qui automatise la saisie d’une limace :

Ici, lorsque l’utilisateur entre une valeur sous la forme de l’admin pour le champ, le se remplira automatiquement avec le bon slugified `` .

22voto

thepeer Points 4699

Dans la plupart des cas, le slug ne devrait pas changer, donc vous ne voulez vraiment le calculer qu'à la première sauvegarde:

 class test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField(editable=False) # hide from admin

    def save(self):
        if not self.id:
            self.s = slugify(self.q)

        super(test, self).save()
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X