代码之家  ›  专栏  ›  技术社区  ›  MikeWyatt

不带方法名的Django url.py

  •  1
  • MikeWyatt  · 技术社区  · 14 年前

    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 回复  |  直到 14 年前
        1
  •  2
  •   Pavel Strakhov    14 年前

    可能是这样的:

    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)]
    )
    
        2
  •  3
  •   Daniel Roseman    14 年前

    可以将基于类的视图与dispatcher方法一起使用:

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

    您的url.py如下所示:

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