Django-fr

Forum

#1 19-02-2012 20:40:05

bluerat
Membre
Inscription : 19-02-2012
Messages : 4

Insérer 2 variables dans une URL

Bonjour,

Je commence à apprendre Django afin de refaire la refonte de mon site :-)

Pour cela, je me sers de divers scripts disponibles pour la partie "blog", comme par exemple : https://github.com/nathanborror/django- … basic/blog

J'aimerai que l'URL d'un article soit de la sorte : http://www.monsite.fr/blog/"categorie"/"slug de l'article"
En remplaçant "categorie" par le slug de la catégorie dans laquelle est l'article, et "slug de l'article" par le slug de l'article ^^

Pour l'instant j'ai ceci dans mes urls :

url(r'^([\w-]+)/(?P<slug>[\w-]+)/$',
        'django.views.generic.list_detail.object_detail',
        dict(
            queryset=Post.online_objects.all(),
            slug_field='slug',
        ),
        name='blog_post',
    ),

Et voici la méthode get_absolute_url() issue du modèle des articles permettant de récupérer l'URL de l'article afin de l'afficher en cliquant dessus :

@models.permalink
def get_absolute_url(self):
    return ('blog_post', [self.category.slug, self.slug])

Alors j'arrive bien à afficher mon article avec l'url souhaitée, par exemple : /blog/django/sortie-de-django-13.
Cependant, si je modifie à la main la catégorie, par exemple /blog/djnafsfs/sortie-de-django-13, et bien l'article s'affiche quand même, ce qui au final est normal et concorde bien avec la regex dans les URLS.
Cependant j'aimerai dans ce cas là rediriger vers une erreur 404, ou au pire faire une redirection automatique vers la bonne url par soucis d'esthétique (comme le font certains CMS).
Bref, comment vérifier que la catégorie dans l'url est bien correcte ( = existe, que ce soit bien la catégorie dans laquelle se trouve l'article) ?

Niveau référencement, est-ce optimal d'afficher le nom de la catégorie dans l'url, ou juste le slug de l'article suffit ? (dans ce cas là je me prends la tête pour rien ^^)

Merci d'avance pour votre aide smile

(PS : je risque de revenir si je rencontre d'autres problèmes, vu que je débute avec Django tongue)

Dernière modification par bluerat (19-02-2012 21:03:16)

Hors ligne

#2 20-02-2012 12:10:07

Julien Bouquillon
Membre
Inscription : 26-09-2011
Messages : 25

Re : Insérer 2 variables dans une URL

Un petit exemple qui pourrait t'inspirer :
http://djangosnippets.org/snippets/2627/

Il faudrait effectivement verifier la validité des 2 slugs avant d'aller
dans la vue détail.

Julien



Le 19 février 2012 20:40, bluerat <chris.b87 _AT_ gmail.com> a écrit :

> Bonjour,
>
> Je commence à apprendre Django afin de refaire la refonte de mon site :-)
>
> Pour cela, je me sers de divers scripts disponibles pour la partie "blog",
> comme par exemple :
> https://github.com/nathanborror/django-basic-apps/tree/master/basic/blog
>
> J'aimerai que l'URL d'un article soit de la sorte :
> http://www.monsite.fr/blog/"categorie"/"slug de l'article"
> En remplaçant "categorie" par le slug de la catégorie dans laquelle est
> l'article, et "slug de l'article" par le slug de l'article ^^
>
> Pour l'instant j'ai ceci dans mes urls :
>

> url(r'^([\w-]+)/(?P<slug>[\w-]+)/$',
>        'django.views.generic.list_detail.object_detail',
>        dict(
>            queryset=Post.online_objects.all(),
>            slug_field='slug',
>        ),
>        name='blog_post',
>    ),
>

>
> Et voici la méthode get_absolute_url() issue du modèle des articles
> permettant de récupérer l'URL de l'article afin de l'afficher en cliquant
> dessus :
>

> @models.permalink
> def get_absolute_url(self):
>    return ('blog_post', [self.category.slug, self.slug])
>

>
> Alors j'arrive bien à afficher mon article avec l'url souhaitée, par
> exemple : /blog/django/sortie-de-django-13.
> Cependant, si je modifie à la main la catégorie, par exemple
> /blog/djnafsfs/sortie-de-django-13, et bien l'article s'affiche quand
> même, ce qui au final est normal et concorde bien avec la regex dans les
> URLS.
> Cependant j'aimerai dans ce cas là rediriger vers une erreur 404, ou au
> pire faire une redirection automatique vers la bonne url (comme le font
> certains CMS).
> Bref, comment vérifier que la catégorie dans l'url est bien correcte ?
>
> Niveau référencement, est-ce optimal d'afficher le nom de la catégorie
> dans l'url, ou juste le slug de l'article suffit ? (dans ce cas là je me
> prends la tête pour rien ^^)
>
> Merci d'avance pour votre aide smile
>
> (PS : je risque de revenir si je rencontre d'autres problèmes, vu que je
> débute avec Django tongue)
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#3 20-02-2012 14:14:58

bluerat
Membre
Inscription : 19-02-2012
Messages : 4

Re : Insérer 2 variables dans une URL

Génial, à en lire le code ça à l'air de faire ce que je souhaite !

Cependant penses-tu pouvoir me guider quant à sa mise en place ?
Une fois copié dans un fichier .py, je l'importe dans le fichiers des urls ? Ou faut-il le déclarer dans les settings (ou autre) ?

Merci d'avance !

Hors ligne

#4 20-02-2012 14:25:58

Julien Bouquillon
Membre
Inscription : 26-09-2011
Messages : 25

Re : Insérer 2 variables dans une URL

oui tu le mets dans filtered_object_detail.py par exemple puis tu
l'importes dans ton urls.py

ensuite tu utilises cette function comme object_detail, il y a un exemple
dans la 'docstring' de la fonction

good luck


Le 20 février 2012 14:14, bluerat <chris.b87 _AT_ gmail.com> a écrit :

> Génial, à en lire le code ça à l'air de faire ce que je souhaite !
>
> Cependant penses-tu pouvoir me guider quant à sa mise en place ?
> Une fois copié dans un fichier .py, je l'importe dans le fichiers des
> urls ? Ou faut-il le déclarer dans les settings (ou autre) ?
>
> Merci d'avance !
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#5 20-02-2012 18:38:29

bluerat
Membre
Inscription : 19-02-2012
Messages : 4

Re : Insérer 2 variables dans une URL

Hahaha ça fonctionne au poil, trop bien big_smile

Merci beaucoup !!!

Hors ligne

#6 20-02-2012 19:10:01

stopher
Membre
Lieu : Lille
Inscription : 26-09-2011
Messages : 11
Site Web

Re : Insérer 2 variables dans une URL

Salut ,

pourrais-tu montrer ton code final, qui fonctionne pour ton cas,
Etant débutant sous Django, ta problématique m'intéresse smile

Merci d'avance ,

Ch.

Le 2012-02-20 à 18:38, bluerat a écrit :

> Hahaha ça fonctionne au poil, trop bien big_smile
>
> Merci beaucoup !!!
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#7 22-02-2012 19:45:20

bluerat
Membre
Inscription : 19-02-2012
Messages : 4

Re : Insérer 2 variables dans une URL

Salut,

Alors j'ai créé un fichier comme me l'a conseillé Julien.
Je l'ai ensuite importé dans le fichier urls.py : from filtered_object_detail import *
Dans ce même fichier urls.py, voici la partie correspondant à l'url du genre /nomdelacategorie/titredelarticle/

url(r'^(?P<category__slug>[\w-]+)/(?P<slug>[\w-]+)/$',
        filtered_object_detail,
        dict(
            queryset=Post.online_objects.all(),
            filters= ['category__slug', 'slug'],
            slug_field='slug',
            template_object_name='post',
        ),
        name='blog_post',
    ),

On voit bien que j'appelle la méthode filtered_object_detail au lieu du nom de la vue (générique ou non).
Dans mon modèle, j'ai le slug qui représente le titre de l'article sous cette forme : titre-de-l-article et j'ai aussi une catégorie en ForeignKey, sachant qu'un article n'est présent que dans une seule catégorie et non dans plusieurs.

Mais faire attention en utilisant cette méthode, car si un jour tu décides de changer l'article de catégorie, il faudra faire des redirection 301 vu que l'URL sera différente.

Dernière modification par bluerat (22-02-2012 19:45:39)

Hors ligne

#8 22-02-2012 19:50:49

stopher
Membre
Lieu : Lille
Inscription : 26-09-2011
Messages : 11
Site Web

Re : Insérer 2 variables dans une URL

Un grand merci pour ce retour smile

A bientôt,
Christophe.

Le 2012-02-22 à 19:45, bluerat a écrit :

> Salut,
>
> Alors j'ai créé un fichier comme me l'a conseillé Julien.
> Je l'ai ensuite importé dans le fichier urls.py : from
> filtered_object_detail import *
> Dans ce même fichier urls.py, voici la partie correspondant à l'url du
> genre /nomdelacategorie/titredelarticle/
>
>

> url(r'^(?P<category__slug>[\w-]+)/(?P<slug>[\w-]+)/$',
>        filtered_object_detail,
>        dict(
>            queryset=Post.online_objects.all(),
>            filters= ['category__slug', 'slug'],
>            slug_field='slug',
>            template_object_name='post',
>        ),
>        name='blog_post',
>    ),
>

>
> On voit bien que j'appelle la méthode filtered_object_detail au lieu du
> nom de la vue (générique ou non).
> Dans mon modèle, j'ai le slug qui représente le titre de l'article sous
> cette forme : titre-de-l-article et j'ai aussi une catégorie en
> ForeignKey, sachant qu'un article n'est présent que dans une seule
> catégorie et non dans plusieurs.
>
> Mais faire attention en utilisant cette méthode, car si un jour tu
> décides de changer de catégorie, il faudra faire des redirection 301 vu
> que l'URL sera différente.
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

Pied de page des forums