我有一个非常标准的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中有类似的东西吗?
答案 0 :(得分:5)
mods = ('Project','Links','Profile','Contact')
urlpatterns = patterns('',
*(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)
答案 1 :(得分:5)
除非你有一个非常巨大的数量的观点,从风格的角度来看,明确地写下它们并不是太糟糕。
但是,您可以使用patterns
函数的prefix参数来缩短示例:
urlpatterns = patterns('mysite.app.views',
(r'^Project/$', 'project'),
(r'^Links/$', 'links'),
(r'^Profile/$', 'profile'),
(r'^Contact/$', 'contact'),
)
答案 2 :(得分: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'}),
此代码未经测试,但总体思路应该有效,即使您应该记住:
明确胜过隐含。