Qu'est-ce qu'une «limace» dans Django?


589

Quand je lis le code Django, je vois souvent dans les modèles ce qu'on appelle un "slug". Je ne sais pas trop ce que c'est, mais je sais que cela a quelque chose à voir avec les URL. Comment et quand cette limace est-elle censée être utilisée?

(J'ai lu sa définition dans ce glossaire .)

Réponses:


753

Un "slug" est un moyen de générer une URL valide, en utilisant généralement les 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, compte tenu du titre (ou d'une autre donnée), plutôt que de le définir manuellement.

Un exemple:

<title> The 46 Year Old Virgin </title>
<content> A silly comedy movie </content>
<slug> the-46-year-old-virgin </slug>

Imaginons maintenant que nous ayons 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 référenceriez-vous cet objet avec une URL et un nom significatif? Vous pouvez par exemple utiliser Article.id pour que l'URL ressemble à ceci:

www.example.com/article/23

Ou, vous voudrez peut-être référencer le titre comme ceci:

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

Étant donné que les espaces ne sont pas valides dans les URL, ils doivent être remplacés par %20, ce qui se traduit par:

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

Les deux tentatives n'aboutissent pas à une URL très significative et facile à lire. C'est mieux:

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

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

Voir également l'URL de cette page Web pour un autre exemple.


72
Bonne description, mais pour ajouter: SlugField ne garantit pas l'unicité de la boîte, donc si vous l'utilisez par défaut, c'est 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 réellement utilisé pour faire la requête (également plus rapide que l'interrogation sur le slug).
Daniel Naab

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

16
Si vous diffusez du contenu basé sur l'ID, décidez si vous souhaitez vérifier que le slug correspond au contenu (et renvoyez 404 s'il ne l'est pas) ou ignorez-le complètement. Je ne pense pas qu'il existe une règle générale pour 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.
Tomas Andrle

2
@Daniel Gardez à l'esprit qu'un slug cache également le véritable ID de la base de données, donc votre exemple élimine un avantage de l'utilisation d'un slug.
Eno

15
@Eno le slug est ajouté pour le référencement et pour les liens permanents. L'ID est utilisé pour la recherche indexée. Le référencement pour stackoverflow est brillant - et ils utilisent exactement cette stratégie. Votre argument était "masquer l'ID de la base de données", que vous avez maintenant transformé en "SEO". Qu'est-ce qui se passe?
Josh Smeaton

134

Si je peux fournir un contexte historique:

Le terme «limace» a trait à la coulée de métal - le plomb, dans ce cas - à partir duquel les polices de presse ont été fabriquées. Chaque papier avait ensuite sa fabrique de polices régulièrement refondue et refondue dans des moules frais, car après de nombreuses impressions, elles étaient usées. Des apprentis comme moi ont commencé leur carrière là-bas et sont allés jusqu'au sommet (plus maintenant).

Les typographes devaient composer le texte d'un article dans le sens inverse avec des personnages principaux empilés de manière judicieuse. Ainsi, au moment de l'impression, les lettres seraient directement sur le papier. Tous les typographes pouvaient lire le journal en miroir aussi vite que celui imprimé. Par conséquent, les limaces, (comme les escargots) ainsi que les histoires lentes (les dernières à être fixées) étaient nombreuses sur le banc d'attente, uniquement identifiées par leurs premières lettres, principalement le titre entier généralement plus lisible. Quelques nouvelles «chaudes» attendaient là sur le banc, pour une éventuelle correction de dernière minute, (Papier du soir) avant le dernier montage et l'impression définitive.

Django est sorti des bureaux du journal Lawrence au Kansas. Là où un certain jargon d'impression persiste probablement. Un passionné de django - & - sympathique-vieux-limace-garçon-de-France.


61

Le terme «limace» 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 se fraye un chemin depuis le beat reporter (en supposant qu'ils existent encore?) Jusqu'à l' éditeur jusqu'aux "presses à imprimer", c'est le nom auquel il est référencé, par exemple, "Avez-vous corrigé ces erreurs dans le ' histoire de kate-and-william? ".

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

Même Stack Overflow le fait lui-même, avec l' auto-référentiel GEB-ish (a)/programming/427102/what-is-a-slug-in-django/427201#427201 , bien que vous puissiez remplacer le slug avec blahblahet il le trouvera toujours correct.

Cela peut même dater plus tôt que cela, car les scénarios avaient des "lignes de slug" au début de chaque scène, ce qui définit essentiellement l'arrière-plan de cette scène (où, quand, etc.). C'est très similaire en ce sens que c'est un précis ou un préambule de ce qui suit.

Sur une machine Linotype, une limace était un morceau de métal d'une seule ligne qui a été créé à partir des formes de lettres individuelles. En créant un seul slug pour toute la ligne, cela s'est considérablement amélioré par rapport à l'ancienne composition par caractère.

Bien que ce qui suit soit une pure conjecture, une des premières significations de la limace était pour une pièce de monnaie contrefaite (qui devrait être appuyée d'une manière ou d'une autre). Je pourrais envisager que cet usage soit transformé en terme d'impression (puisque le limace devait être pressé en utilisant les caractères originaux) et à partir de là, passant de la définition de «morceau de métal» à la définition de «résumé de l'histoire». À partir de là, il suffit de passer d'une impression correcte au monde en ligne.


(a) "Godel Escher, Bach", par un Douglas Hofstadter , que je considère (au moins) comme l'une des grandes œuvres intellectuelles modernes. Vous devriez également consulter son autre travail, "Thèmes métamagiques".


29

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

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

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

Entrez la description de l'image ici

Le titre que vous avez entré était quelque chose comme ça -> Qu'est-ce qu'un «slug» dans Django?

En le stockant dans un champ de slug, il devient "what-is-a-slug-in-django" (voir URL de cette page)


27

D' ici .

«Slug» est un terme de journal, mais ce que cela signifie ici est la dernière partie de l'URL. Par exemple, un article avec le titre «A bit about Django» deviendrait automatiquement «bit-about-django» (vous pouvez bien sûr le changer facilement si vous n'aimez pas le slug généré automatiquement).


18

C'est une partie descriptive de l'URL qui est là pour la rendre plus descriptive, mais sans nécessairement être requise par le serveur Web - dans Qu'est-ce qu'un "slug" dans Django? le slug est 'in-django-what-is-a-slug', mais le slug n'est pas utilisé pour déterminer la page servie (sur ce site au moins)


17

Slug est une étiquette courte adaptée aux URL pour un contenu spécifique. Il ne contient que des lettres, des chiffres, des tirets bas ou des tirets. Les limaces sont généralement enregistrées avec le contenu respectif et elles sont transmises sous forme de chaîne URL.

Slug peut créer en utilisant SlugField

Ex:

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

Si vous voulez utiliser le titre comme slug, django a 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)

S'il a besoin d'unicité, ajoutez unique=Truedans le champ slug.

par exemple, de l'exemple précédent:

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

Êtes-vous paresseux pour faire un processus de limace? ne vous inquiétez pas, ce plugin vous aidera. django-autoslug


8

Également slug automatique sur django-admin. Ajouté chez ModelAdmin:

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

Comme ici:

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'slug')
    search_fields = ('content', )

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.