Question

I have a pretty standard django app, and am wondering how to set the url routing so that I don't have to explicitly map each url to a view.

For example, let's say that I have the following views: Project, Links, Profile, Contact. I'd rather not have my urlpatterns look like this:

(r'^Project/$', 'mysite.app.views.project'),
(r'^Links/$', 'mysite.app.views.links'),
(r'^Profile/$', 'mysite.app.views.profile'),
(r'^Contact/$', 'mysite.app.views.contact'),

And so on. In Pylons, it would be as simple as:

map.connect(':controller/:action/:id')

And it would automatically grab the right controller and function. Is there something similar in Django?

Was it helpful?

Solution

mods = ('Project','Links','Profile','Contact')

urlpatterns = patterns('',
   *(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)

OTHER TIPS

Unless you have a really huge number of views, writing them down explicitly is not too bad, from a style perspective.

You can shorten your example, though, by using the prefix argument of the patterns function:

urlpatterns = patterns('mysite.app.views',
    (r'^Project/$', 'project'),
    (r'^Links/$', 'links'),
    (r'^Profile/$', 'profile'),
    (r'^Contact/$', 'contact'),
)

You might be able to use a special view function along these lines:

def router(request, function, module):
    m =__import__(module, globals(), locals(), [function.lower()])
    try:
        return m.__dict__[function.lower()](request)
    except KeyError:
        raise Http404()

and then a urlconf like this:

(r'^(?P<function>.+)/$', router, {"module": 'mysite.app.views'}),

This code is untested but the general idea should work, even though you should remember:

Explicit is better than implicit.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top