Django: Как мне создать общую URL-маршрутизацию к представлениям?
Вопрос
У меня довольно стандартное приложение django, и мне интересно, как настроить URL-маршрутизацию, чтобы мне не приходилось явно отображать каждый URL-адрес в виде. Р>
Например, предположим, что у меня есть следующие представления: Проект, Ссылки, Профиль, Контакт
. Я бы предпочел, чтобы мои urlpatterns
выглядели так:
(r'^Project/
И так далее. В Pylons это будет так просто:
map.connect(':controller/:action/:id')
И он автоматически получит нужный контроллер и функцию. Есть ли что-то похожее в Django?
, 'mysite.app.views.project'),
(r'^Links/
И так далее. В Pylons это будет так просто:
<*>
И он автоматически получит нужный контроллер и функцию. Есть ли что-то похожее в Django?
, 'mysite.app.views.links'),
(r'^Profile/
И так далее. В Pylons это будет так просто:
<*>
И он автоматически получит нужный контроллер и функцию. Есть ли что-то похожее в Django?
, 'mysite.app.views.profile'),
(r'^Contact/
И так далее. В Pylons это будет так просто:
<*>
И он автоматически получит нужный контроллер и функцию. Есть ли что-то похожее в Django?
, 'mysite.app.views.contact'),
И так далее. В Pylons это будет так просто:
<*>И он автоматически получит нужный контроллер и функцию. Есть ли что-то похожее в Django?
Решение
mods = ('Project','Links','Profile','Contact')
urlpatterns = patterns('',
*(('^%s/%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)
Другие советы
Если у вас действительно огромное количество просмотров, явно записать их не так уж и плохо, с точки зрения стиля.
Однако вы можете сократить свой пример, используя префиксный аргумент функции Patterns
:
urlpatterns = patterns('mysite.app.views',
(r'^Project/, 'project'),
(r'^Links/, 'links'),
(r'^Profile/, 'profile'),
(r'^Contact/, 'contact'),
)
Возможно, вы сможете использовать специальную функцию просмотра в этих строках:
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'}),
Этот код не проверен, но общая идея должна работать, даже если вы должны помнить:
Явный лучше, чем неявный.