Django: Как мне создать общую URL-маршрутизацию к представлениям? - PullRequest
7 голосов
/ 03 октября 2008

У меня довольно стандартное приложение django, и мне интересно, как настроить URL-маршрутизацию, чтобы мне не приходилось явно отображать каждый URL-адрес в виде.

Например, допустим, у меня есть следующие представления: Project, Links, Profile, Contact. Я бы предпочел, чтобы мой urlpatterns не выглядел так:

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

И так далее. В Pylons это будет просто:

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

И он автоматически получит нужный контроллер и функцию. Есть ли что-то похожее в Django?

Ответы [ 3 ]

5 голосов
/ 03 октября 2008

Если у вас нет действительно огромного количества просмотров, явное их записывание не так уж и плохо с точки зрения стиля.

Однако вы можете сократить свой пример, используя префиксный аргумент функции patterns:

urlpatterns = patterns('mysite.app.views',
    (r'^Project/$', 'project'),
    (r'^Links/$', 'links'),
    (r'^Profile/$', 'profile'),
    (r'^Contact/$', 'contact'),
)
5 голосов
/ 04 октября 2008

Возможно, вы сможете использовать специальную функцию просмотра в следующих строках:

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

и затем urlconf как это:

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

Этот код не проверен, но общая идея должна работать, даже если вы должны помнить:

Явное лучше, чем неявное.

5 голосов
/ 03 октября 2008
mods = ('Project','Links','Profile','Contact')

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