Quelque soit le langage, un élément est toujours délicat à traiter : créer des url cool, avec des vrais mots.
Mais en ne plaçant pas de caractères qui vont rendre l’url toute pas jolie avec des %20 et autres.

Pour cela, il faut supprimer tous les accents (et les remplacer par leur lettre sans accent); supprimer les espaces (et les remplacer par des -) et supprimer les signes de ponctuation (et ne pas les remplacer).

Avec Django, pas besoin de s’embêter avec ça :)
Il y a les slugs.
Par principe, un slug contiendra toujours une valeur qu’il est possible de mettre en url et sera toujours unique.
A vous par la suite de l’utiliser pour créer l’url de vos objets.

Mais il faut encore le définir correctement :)
Pour cela, dans votre administration, nous allons placer un prepopulated_field.
Placez dans vos fieldsets le titre de l’uplet et son slug.

Puis placez le code suivant en dessous de la définition des fieldsets :

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

Ou slug est le nom du champ « slug » (je vous conseille de l’appeller slug).
Et ou title est le nom de votre champ de titre.

Chargez votre administration, remplissez votre titre et admirez votre champ de slug se remplir tout seul :)
Vous constaterez également qu’il ne se remplit que lors de la première édition, pour éviter un changement d’url inopportun lorsque vous changez le titre de la page.
Rien ne vous empêche par ailleurs de placer le slug de votre choix.

Vous pouvez par ailleurs personnaliser la chose dans votre application.
Par exemple dans un template, pour afficher la valeur d’un string slugifié :

{{ "mon Test"|slugify }}

Affichera : mon-test

Et dans vos fichiers .py directement également

from django.template import defaultfilters
slug = defaultfilters.slugify("Mon Test")

la variable slug contiendra alors mon-test.

Et vous pouvez faire de belles URLs. N’oubliez pas d’utiliser les vues génériques pour trouver le contenu qui correspond à un slug et le charger :)

6 Réponses à “Django : les slugs”

  1. QNux dit :

    Merci pour cette astuce !

  2. loïc m. dit :

    tien, ça me rappel comme un air de symfony tout ça :)

  3. Damien dit :

    Oui. Sauf que c’est pas Django qui a repris l’idée sur Symfony mais plutôt le contraire hein ;)

  4. Palleas dit :

    Ah c’est marrant, moi je croyais que le framework de routing de Sf s’était inspiré de ROR, on m’aurait menti ? :o

  5. Damien dit :

    D’ou t’a vu que c’est du routing ? On transforme des chaines de caractères pour les mettre dans l’url. Mais on route rien la hein :)

    Rails ne contient, de base, rien pour faire ce genre de choses. Il faut utiliser un plugin.
    Permalink Fu par exemple : http://github.com/technoweenie/permalink_fu/tree/master

  6. Palleas dit :

    Ah oué j’ai extrapolé un peu vite, pardon! :D

Laisser une réponse

 
Fork me on GitHub