767 votes

Qu'est-ce qu'un "slug" en Django ?

Lorsque je lis du code Django, je vois souvent dans les modèles ce qu'on appelle un "slug". Je ne suis pas tout à fait sûr de ce que c'est, mais je sais que cela a quelque chose à voir avec les URLs. Comment et quand est-ce que ce slug-chose est censé être utilisé?

J'ai lu sa définition ci-dessous dans ce glossaire:

Slug
Un petit label pour quelque chose, ne contenant que des lettres, des chiffres, des traits de soulignement ou des tirets. Ils sont généralement utilisés dans les URLs. Par exemple, dans une URL d'entrée de blog typique:

https://www.djangoproject.com/weblog/2008/apr/12/spring/ la dernière partie (printemps) est le slug.

56 votes

Pour comprendre instantanément, regardez l'URL du site sur lequel vous vous trouvez : https://stackoverflow.com/questions/{id}/{slug}

957voto

Josh Smeaton Points 18165

Un "slug" est une façon de générer une URL valide, généralement en utilisant des données déjà obtenues. Par exemple, un slug utilise le titre d'un article pour générer une URL. Je conseille de générer le slug au moyen d'une fonction, en donnant le titre (ou une autre donnée), plutôt que de le définir manuellement.

Un exemple:

 The 46 Year Old Virgin 
 Un film comique ridicule 
 the-46-year-old-virgin 

Maintenant, imaginons que nous avons un modèle Django tel que:

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField(max_length=1000)
    slug = models.SlugField(max_length=40)

Comment feriez-vous référence à cet objet avec une URL et un nom significatif? Vous pourriez par exemple utiliser Article.id donc l'URL ressemblerait à ceci:

www.example.com/article/23

Ou, vous pourriez vouloir référencer le titre de cette façon:

www.example.com/article/The 46 Year Old Virgin

Comme les espaces ne sont pas valides dans les URL, ils doivent être remplacés par %20, ce qui donne:

www.example.com/article/The%2046%20Year%20Old%20Virgin

Les deux tentatives ne donnent pas des URL très significatives, faciles à lire. Ceci est mieux:

www.example.com/article/the-46-year-old-virgin

Dans cet exemple, the-46-year-old-virgin est un slug: il est créé à partir du titre en mettant toutes les lettres en minuscules, et en remplaçant les espaces par des tirets -.

Veuillez également consulter l'URL de cette même page web pour un autre exemple.

103 votes

Bonne description, mais pour ajouter : SlugField ne garantit pas l'unicité par défaut, donc si vous l'utilisez par défaut, voici une meilleure URL: www.example.com/article/the-40-year-old-virgin/23/ Où '23' est l'article.id, et c'est ce qui est en réalité utilisé pour effectuer la requête (plus rapide que de requêter sur le slug).

167 votes

Je trouve www.example.com/article/23/the-40-year-old-virgin plus facile à lire.

21 votes

Si vous servez du contenu basé sur l'identifiant, décidez s'il faut vérifier si le slug correspond au contenu (et retourner 404 s'il ne correspond pas) ou l'ignorer complètement. Je ne pense pas qu'il y ait une règle générale pour savoir ce qui est le mieux en termes de référencement. SO affichera toujours cette page si vous entrez stackoverflow.com/questions/427102/… dans votre navigateur.

177voto

Si je peux fournir un peu de contexte historique :

Le terme "slug" a à voir avec la fonte du métal - du plomb, dans ce cas - à partir duquel les polices d'impression étaient fabriquées. Chaque papeterie avait alors son usine de moulage de polices régulièrement refondue et refaite dans de nouveaux moules, car après de nombreuses impressions, elles s'usaient. Les apprentis comme moi commençaient leur carrière là-bas, et montaient jusqu'au sommet (mais plus maintenant).

Les typographes devaient composer le texte d'un article de manière inversée avec des caractères en plomb empilés avec sagesse. Ainsi, au moment de l'impression, les lettres seraient droites sur le papier. Tous les typographes pouvaient lire le journal en miroir aussi vite que la version imprimée. Donc les slugs, (comme des escargots) aussi les histoires lentes (les dernières à être corrigées) étaient nombreuses sur le banc en attente, uniquement identifiées par leurs premières lettres, généralement le titre complet plus lisible. Certaines "infos chaudes" attendaient là sur le banc, pour une éventuelle correction de dernière minute (journal du soir) avant le dernier assemblage et l'impression définitive.

Django a émergé des bureaux du journal Lawrence au Kansas. Où probablement subsiste un peu de jargon d'imprimerie. Un-vieux-slug-amical-amateur-de-Django-venant-de-France.

81voto

paxdiablo Points 341644

Le terme « slug » vient du monde de la production de journaux.

C'est un nom informel donné à une histoire pendant le processus de production. Alors que l'histoire chemine de la reporter spécialisée (en supposant qu'elles existent encore) à l'éditeur jusqu'aux « presses à imprimer », c'est de cette façon qu'elle est référencée, par exemple, « As-tu corrigé ces erreurs dans l'histoire 'kate-and-william'? ».

Certains systèmes (comme Django) utilisent le slug comme partie de l'URL pour localiser l'histoire, un exemple étant www.mysite.com/archives/kate-and-william.

Même Stack Overflow le fait, avec le (a) auto-référentiel de GEB https://stackoverflow.com/questions/427102/what-is-a-slug-in-django/427201#427201, même si vous pouvez remplacer le slug par blahblah et il le trouvera toujours correctement.

Cela remonte peut-être même plus loin que ça, car les scénarios avaient des "lignes de slug" au début de chaque scène, qui définissaient essentiellement le contexte de cette scène (où, quand, etc.). C'est très similaire en ce sens que c'est un résumé ou un préambule de ce qui suit.

Sur une machine Linotype, un slug était un morceau de métal d'une seule ligne qui était créé à partir des formes individuelles des lettres. En créant un slug unique pour toute la ligne, cela améliorait grandement la composition caractère par caractère ancienne.

Bien que ce qui suit relève de la pure conjecture, un sens ancien de slug était pour une pièce de monnaie contrefaite (qui devait être pressée d'une manière ou d'une autre). Je pourrais envisager que ce sens ait été transformé en terme d'impression (puisqu'il fallait presser le slug en utilisant les caractères originaux) et à partir de là, passer de la définition de 'morceau de métal' à la définition de 'résumé d'histoire'. De là, on passe rapidement de l'impression traditionnelle au monde en ligne.


(a) "Gödel, Escher, Bach", par un certain Douglas Hofstadter, que je considère personnellement comme l'une des grandes œuvres intellectuelles modernes. Vous devriez aussi jeter un œil à son autre ouvrage, "Métamagiques Thèmes".

0 votes

Dmid://uu457selfrefer1645699930

42voto

Manjit Kumar Points 530

Slug est un terme de journal. Un slug est une étiquette courte pour quelque chose, ne contenant que des lettres, des chiffres, des traits de soulignement ou des tirets. Ils sont généralement utilisés dans les URL. (comme dans la documentation de Django)

Un champ de slug dans Django est utilisé pour stocker et générer des URLs valides pour vos pages web créées dynamiquement.

Tout comme vous avez ajouté cette question sur Stack Overflow et qu'une page dynamique a été générée et lorsque vous regardez dans la barre d'adresse, vous verrez le titre de votre question avec "-" à la place des espaces. C'est exactement le rôle d'un champ de slug.

Entrer la description de l'image ici

Le titre que vous avez saisi était quelque chose comme ceci -> Qu'est-ce qu'un "slug" dans Django?

En le stockant dans un champ de slug, cela devient "qu-est-ce-qu-un-slug-dans-django" (voir l'URL de cette page)

34voto

Simplans Points 1573

Slug est un label court convivial pour les URL concernant un contenu spécifique. Il ne contient que des lettres, des chiffres, des traits de soulignement ou des tirets. Les slugs sont généralement enregistrés avec le contenu correspondant et ils sont transmis en tant que chaîne URL.

Slug peut être créé en utilisant SlugField

Ex :

class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)

Si vous souhaitez utiliser le titre comme slug, Django dispose d'une fonction simple appelée slugify

from django.template.defaultfilters import slugify

class Article(models.Model):
    title = models.CharField(max_length=100)

    def slug(self):
        return slugify(self.title)

Si une unicité est nécessaire, ajoutez unique=True dans le champ slug.

Par exemple, dans l'exemple précédent :

class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100, unique=True)

Vous êtes trop paresseux pour effectuer le processus de slug ? Ne vous inquiétez pas, ce plugin vous aidera. django-autoslug

1 votes

Peut utiliser AutoSlugField des extensions Django, fonctionne mieux dans la plupart des cas.

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