Django url.py без имен методов - PullRequest
1 голос
/ 24 июня 2010

В моем проекте Django мой модуль url.py выглядит примерно так:

urlpatterns = patterns('',
    (r'^$', 'web.views.home.index'),
    (r'^home/index', 'web.views.home.index'),
    (r'^home/login', 'web.views.home.login'),
    (r'^home/logout', 'web.views.home.logout'),
    (r'^home/register', 'web.views.home.register'),
)

Есть ли способ упростить это, чтобы мне не требовалась запись для каждого метода в моем представлении?Что-то вроде этого было бы неплохо:

urlpatterns = patterns('',
    (r'^$', 'web.views.home.index'),
    (r'^home/(?<method_name>.*)', 'web.views.home.(?P=method_name)'),
)

ОБНОВЛЕНИЕ

Теперь, когда я знаю хотя бы один способ сделать это, рекомендуется ли такое?Или есть веская причина явно создавать сопоставление для каждого отдельного метода?

Ответы [ 2 ]

3 голосов
/ 24 июня 2010

Вы можете использовать представление на основе классов с методом диспетчера:

class MyView(object):
    def __call__(self, method_name):
        if hasattr(self, method_name):
            return getattr(self, method_name)()


    def index(self):
        ...etc...

, и ваш urls.py будет выглядеть так:

from web.views import MyView
urlpatterns = patterns('',
    (r'^$', 'web.views.home.index'),
    (r'^home/(?<method_name>.*)', MyView()),
)
2 голосов
/ 24 июня 2010

Может быть что-то вроде этого:

import web.views.home as views_list
urlpatterns = patterns('',
    (r'^$', 'web.views.home.index'),
    *[(r'^home/%s' % i, 'web.views.home.%s' % i) for i in dir(views_list)]
)
...