8

我有一个非常标准的 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中有类似的东西吗?

4

3 回答 3

5
mods = ('Project','Links','Profile','Contact')

urlpatterns = patterns('',
   *(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)
于 2008-10-03T18:49:41.760 回答
5

除非你有大量的视图,否则从风格的角度来看,明确地写下来并不算太糟糕。

但是,您可以通过使用patterns函数的前缀参数来缩短示例:

urlpatterns = patterns('mysite.app.views',
    (r'^Project/$', 'project'),
    (r'^Links/$', 'links'),
    (r'^Profile/$', 'profile'),
    (r'^Contact/$', 'contact'),
)
于 2008-10-03T19:51:36.410 回答
5

您可能可以按照以下方式使用特殊的视图功能:

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'}),

此代码未经测试,但总体思路应该有效,即使您应该记住:

显式优于隐式。

于 2008-10-03T20:06:35.817 回答