Django: Como posso criar um URL genérico encaminhamento para pontos de vista?
Pergunta
Eu tenho um aplicativo django bastante normal, e estou querendo saber como definir a url roteamento de modo que eu não tenho para mapear explicitamente cada url para uma visão.
Por exemplo, digamos que eu tenho as seguintes exibições: Project, Links, Profile, Contact
. Eu prefiro não ter o meu urlpatterns
parecido com este:
(r'^Project/$', 'mysite.app.views.project'),
(r'^Links/$', 'mysite.app.views.links'),
(r'^Profile/$', 'mysite.app.views.profile'),
(r'^Contact/$', 'mysite.app.views.contact'),
E assim por diante. Em Pilões , seria tão simples como:
map.connect(':controller/:action/:id')
E seria automaticamente pegar o controlador e função direita. Existe algo semelhante em Django?
Solução
mods = ('Project','Links','Profile','Contact')
urlpatterns = patterns('',
*(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)
Outras dicas
A menos que você tem realmente um enorme número de pontos de vista, escrevê-las explicitamente não é muito ruim, do ponto de vista de estilo.
Você pode encurtar o seu exemplo, porém, usando o argumento prefixo da função patterns
:
urlpatterns = patterns('mysite.app.views',
(r'^Project/$', 'project'),
(r'^Links/$', 'links'),
(r'^Profile/$', 'profile'),
(r'^Contact/$', 'contact'),
)
Você pode ser capaz de usar uma função de visualização especial ao longo destas linhas:
def router(request, function, module):
m =__import__(module, globals(), locals(), [function.lower()])
try:
return m.__dict__[function.lower()](request)
except KeyError:
raise Http404()
e, em seguida, um urlconf assim:
(r'^(?P<function>.+)/$', router, {"module": 'mysite.app.views'}),
Este código não foi testado, mas a idéia geral deve funcionar, mesmo que você deve se lembrar:
Explícito é melhor que implícito.