Django: Como posso criar um URL genérico encaminhamento para pontos de vista?

votos
7

Eu tenho um aplicativo django bastante normal, e estou querendo saber como definir o roteamento de URL para 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 urlpatternsolhar como 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?

Publicado 03/10/2008 em 18:58
fonte usuário
Em outras línguas...                            


3 respostas

votos
5

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 depois 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.

Respondeu 03/10/2008 em 21:06
fonte usuário

votos
5

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 patternsfunção:

urlpatterns = patterns('mysite.app.views',
    (r'^Project/$', 'project'),
    (r'^Links/$', 'links'),
    (r'^Profile/$', 'profile'),
    (r'^Contact/$', 'contact'),
)
Respondeu 03/10/2008 em 20:51
fonte usuário

votos
5

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

urlpatterns = patterns('',
   *(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)
Respondeu 03/10/2008 em 19:49
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more