How to use Django URL dispatcher
Django routing module called URL dispatcher
url.py
Normally, When a user requests a page from your Django-powered site Django loads the URLconf module from a file called urls.py at the root of your project, Ordinarily, this is the value of the ROOT_URLCONF setting, The URL dispatcher can be overridden when the incoming HttpRequest object has an attribute called urlconf (set by middleware request processing), its value will be used in place.
First line in your urls.py should be:
1 | from django.conf.urls import patterns |
urlpatterns
Django loads that file and looks for the variable urlpatterns. This should be a Python list, in the format returned by the function django.conf.urls.patterns().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from django.conf.urls.defaults import patterns urlpatterns = patterns('', # ex: / (r'^$', 'myapp.views.home', {}, 'index'), # ex: /about (r'^about', 'myapp.views.about', {}, 'about'), .... ) # To add more urlpatterns in the same urls.py you can use: urlpatterns += patterns('', .... ) |
URL Pattern Arguments
- First Argument is URL pattern.
- Second is the View to send back.
- Third is Dictionary to send to the view.
- Last argument is Name. Naming enables calling {% url name %} from templates.
Notes
- Django runs through each line, in order, and stops at the first one that matches the request.
- The ‘r’ in front of each regular expression string is optional but recommended. It tells Python that a string is “raw” – that nothing in the string should be escaped. See Dive Into Python’s explanation.
url() function
You can use the url( convenience wrapper.
The url() function is passed five arguments, two required: regex and view, and three optional: kwargs, name, and prefix.
You can use the url() function, instead of a tuple, as an argument topatterns(). This is convenient if you want to supply a name but not extra_context you’d still have to include an empty optional extra arguments dictionary in the tuple version
Remember you need to include the url, from django.conf.urls.defaults.
1 | from django.conf.urls.defaults import patterns, url |
These are the same:
1 2 | (r'^$', 'views.home', {}, 'index'), url(r'^$', views.index, name='index'), |
Import views to shorten code
You can use either way, as you feel convenient for you. It’s the same code above, but using Import to shorten code:
Method 1: Import Views Class
1 2 3 4 5 6 7 | from django.conf.urls.defaults import patterns from myapp import views urlpatterns = patterns('', (r'^$', 'views.home', {}, 'index'), ..... ) |
Method 2: Import Views (or *)
1 2 3 4 5 6 | from django.conf.urls.defaults import patterns from myapp.views import home urlpatterns = patterns('', (r'^$', 'home', {}, 'index'), ..... |
Method 3: Use Default Pattern
1 2 3 4 | urlpatterns = patterns('myapp.views', (r'^$', 'home', {}, 'index'), ..... ) |
Include
You can include from another file, Django app or object. remember to import the include() function.
1 2 3 4 5 6 | from django.conf.urls.defaults import patterns, url, include urlpatterns = patterns('', # ex: /help url(r'^help/', include('help.urls')), ..... ) |
This code will search for url.py file inside help app in your django project. construct the file the same as the url.py file.
Include in the same file
1 2 3 4 5 6 7 8 9 10 | from django.conf.urls.defaults import patterns, url, include extra_patterns = patterns('', ....... ) urlpatterns = patterns('', (r'^extra/', include(extra_patterns)), ..... ) |
These are the URL dispatcher basics. Maybe I’ll be post later another post on more advanced aspects of the URL dispatcher include URL grouping, passing extra parameters to view and more…
CYA,
And good luck with Django – It worth it!
Development Specialist, Artist and Activist
Personal Website