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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top