Django:如何创建通往视图的通用网址路由?
时间:2020-03-06 15:05:19 来源:igfitidea点击:
我有一个非常标准的django应用程序,并且想知道如何设置url路由,这样我就不必显式地将每个url映射到一个视图。
例如,假设我有以下视图:"项目,链接,配置文件,联系人"。我宁愿不要让我的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'),
等等。在塔架中,它很简单:
map.connect(':controller/:action/:id')
并且它将自动获取正确的控制器和功能。 Django中有类似的东西吗?
解决方案
mods = ('Project','Links','Profile','Contact')
urlpatterns = patterns('',
*(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)
从样式的角度来看,除非我们有大量的视图,否则将它们明确写下来并不是很糟糕。
不过,我们可以使用patterns函数的prefix参数来简化示例:
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'}),
这段代码未经测试,但是一般的想法应该起作用,即使我们应该记住:
显式胜于隐式。

