Django - Mappage d'URL

Maintenant que nous avons une vue de travail comme expliqué dans les chapitres précédents. Nous voulons accéder à cette vue via une URL. Django a sa propre méthode pour le mappage d'URL et cela se fait en éditant le fichier url.py de votre projet(myproject/url.py). Le fichier url.py ressemble à -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
)

Lorsqu'un utilisateur demande une page sur votre application Web, le contrôleur Django prend le relais pour rechercher la vue correspondante via le fichier url.py, puis renvoie la réponse HTML ou une erreur 404 non trouvée, si elle n'est pas trouvée. Dans url.py, le plus important est le"urlpatterns"tuple. C'est là que vous définissez le mappage entre les URL et les vues. Un mappage est un tuple dans des modèles d'URL comme -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)

La ligne marquée mappe l'URL "/ home" à la vue Hello créée dans le fichier myapp / view.py. Comme vous pouvez le voir ci-dessus, un mapping est composé de trois éléments -

  • The pattern- Une expression rationnelle correspondant à l'URL que vous souhaitez résoudre et mapper. Tout ce qui peut fonctionner avec le module python 're' est éligible pour le modèle (utile lorsque vous voulez passer des paramètres via url).

  • The python path to the view - Idem que lorsque vous importez un module.

  • The name- Pour effectuer l'inversion d'URL, vous devez utiliser des modèles d'URL nommés comme dans les exemples ci-dessus. Une fois terminé, démarrez simplement le serveur pour accéder à votre vue via: http: //127.0.0.1/hello

Organisation de vos URL

Jusqu'à présent, nous avons créé les URL dans le fichier «myprojects / url.py», mais comme indiqué précédemment à propos de Django et de la création d'une application, le meilleur point était de pouvoir réutiliser des applications dans différents projets. Vous pouvez facilement voir quel est le problème, si vous enregistrez toutes vos URL dans le fichier «projecturl.py». La meilleure pratique consiste donc à créer un "url.py" par application et à l'inclure dans le fichier url.py de nos principaux projets (nous avons déjà inclus des URL d'administration pour l'interface d'administration).

Comment est-il fait?

Nous devons créer un fichier url.py dans myapp en utilisant le code suivant -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

Ensuite, myproject / url.py deviendra le suivant -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^myapp/', include('myapp.urls')),
)

Nous avons inclus toutes les URL de l'application myapp. Le home.html qui a été accédé via "/ hello" est maintenant "/ myapp / hello" qui est une structure meilleure et plus compréhensible pour l'application Web.

Imaginons maintenant que nous ayons une autre vue dans myapp "morning" et que nous souhaitons la mapper dans myapp / url.py, nous changerons ensuite notre myapp / url.py en -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
   url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)

Cela peut être re-factorisé pour -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),)

Comme vous pouvez le voir, nous utilisons maintenant le premier élément de notre urlpatternstuple. Cela peut être utile lorsque vous souhaitez modifier le nom de votre application.

Envoi de paramètres aux vues

Nous savons maintenant comment mapper des URL, comment les organiser, voyons maintenant comment envoyer des paramètres aux vues. Un exemple classique est l'exemple d'article (vous souhaitez accéder à un article via «/ articles / article_id»).

Le passage des paramètres se fait en les capturant avec le regexpdans le modèle d'URL. Si nous avons une vue comme la suivante dans "myapp / view.py"

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

Nous voulons le mapper dans myapp / url.py afin de pouvoir y accéder via "/ myapp / article / articleId", nous avons besoin des éléments suivants dans "myapp / url.py" -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)

Lorsque Django verra l'url: «/ myapp / article / 42», il passera les paramètres «42» à la vue viewArticle, et dans votre navigateur, vous devriez obtenir le résultat suivant -

Notez que l'ordre des paramètres est important ici. Supposons que nous voulions la liste des articles d'un mois d'une année, ajoutons une vue viewArticles. Notre view.py devient -

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

def viewArticle(request, month, year):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

Le correspondant url.py le fichier ressemblera à -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)

Maintenant, quand vous allez dans "/ myapp / articles / 12/2006 /" vous obtiendrez "Affichage des articles de: 2006/12" mais si vous inversez les paramètres, vous n'obtiendrez pas le même résultat.

Pour éviter cela, il est possible de lier un paramètre URL au paramètre de vue. Pour cela, notreurl.py deviendra -

from django.conf.urls import patterns, include, url

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)