Projects and apps

There should be one urls.py at the project level, and one urls.py at each app level. The project level urls.py should include each of the urls.py under a prefix.:

#project urls.py

urlpatterns = patterns(
    (r'^', include('mainpages.urls')),
    (r'^admin/', include(admin.site.urls)),
    (r'^captcha/', include('yacaptcha.urls')),

#app urls.py
urlpatterns = patterns(
    url(r'^$', 'index'),
    url(r'^what/$', 'what_view')

Naming urls

Urlpatterns should be named. [1] This is done as:

url(r'^$', 'index', name='main_index'),

This enables calling {% url urlpatternname %} much easier.

The pattern name should be of the form appname_viewname. If the same view is used in multiple urlpatterns, the name should be of form appname_viewname_use, as in search_advanced_product and search_advanced_content.:

#urls.py for app search
urlpatterns = patterns(
url(r'^advanced_product_search/$', 'advanced', name='search_advanced_product'),
url(r'^advanced_content_search/$', 'advanced', name='search_advanced_content'),

Here the same view advanced is used at two different urls and has two different names.