Dans Django, il est possible de définir les urls à différents endroits :

  • au niveau du projet : dans monprojet/urls.py
  • au niveau de chaque application : dans monprojet/monapplication/urls.py

Solution 1 : vous stockez les urls au niveau du projet :

from django.conf.urls.defaults import *
 
urlpatterns = patterns('',
    (r'^admin/', include('django.contrib.admin.urls')),
    (r'^app/$', 'monprojet.monapplication.views.index'),
    (r'^app/page', 'monprojet.monapplication.views.page'),
)

Solution 2 : au niveau de chaque application :

Dans monprojet/urls.py :

from django.conf.urls.defaults import *
 
urlpatterns = patterns('',
    (r'^admin/', include('django.contrib.admin.urls')),
    (r'^app/', include('monprojet.monapplication.urls')),
)

et dans monprojet/monapplication/urls.py - attention à bien définir un chemin relatif (voir plus bas pour plus d'explications) :

from django.conf.urls.defaults import *
 
urlpatterns = patterns('',
    (r'^$', 'monprojet.monapplication.views.index'),
    (r'^page', 'monprojet.monapplication.views.page'),
)

Vous pouvez même simplifier ce dernier élément de la façon suivante :

from django.conf.urls.defaults import *
 
urlpatterns = patterns('monprojet.monapplication',
    (r'^$', 'views.index'),
    (r'^page', 'views.page'),
)

Pour le contenu de monprojet/monapplication/urls.py, attention à ne pas faire apparaître une deuxième fois le chemin, comme on pourrait le croire :

from django.conf.urls.defaults import *
 
urlpatterns = patterns('',
    (r'^app/$', 'monprojet.monapplication.views.index'),
    (r'^app/page', 'monprojet.monapplication.views.page'),
)

Faute de quoi, django vous renverra une erreur 404 si vous appelez http://www.domain.tld/app/ car il cherchera le motif http://www.domain.tld/app/app/. Le premier "app" est en fait déjà définit dans monprojet/urls.py et le second dans monprojet/monapplication/urls.py.

En savoir plus : http://www.djangoproject.com/documentation/url_dispatch/