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

StackOverflow https://stackoverflow.com/questions/168113

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня довольно стандартное приложение 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'}),

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top