2008-10-03 16 views
6

Tengo una aplicación django bastante estándar, y me pregunto cómo configurar el enrutamiento de la url para que no tenga que asignar explícitamente cada url a una vista.Django: ¿Cómo creo un enrutamiento url genérico a las vistas?

Por ejemplo, digamos que tengo las siguientes vistas: Project, Links, Profile, Contact. Yo prefiero no tener mi mirada urlpatterns así:

(r'^Project/$', 'mysite.app.views.project'), 
(r'^Links/$', 'mysite.app.views.links'), 
(r'^Profile/$', 'mysite.app.views.profile'), 
(r'^Contact/$', 'mysite.app.views.contact'), 

Y así sucesivamente. En Pylons, sería tan simple como:

map.connect(':controller/:action/:id') 

Y sería agarrar automáticamente el controlador y la función correcta. ¿Hay algo similar en Django?

+0

Espera, ¿quieres '^ Links/$', para apuntar a 'mysite.app.views.links'? –

+0

Sí, copiar/pegar los errores son bastante dulces. – swilliams

Respuesta

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

urlpatterns = patterns('', 
    *(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods) 
) 
+0

Eso me da un error. El objeto 'generador' no tiene 'resolver'. Creo que sé lo que estás intentando hacer (escribir una ruta para cada cadena en la tupla), pero está creando un Generador que django no puede resolver en su lugar. – swilliams

+0

no lo probé, intente desenvolver el generador con un * (... por ...). Estoy editando la respuesta – Javier

+0

Estoy obteniendo un error de sintaxis con esto ahora. Nunca he visto * usado así ... ¿se supone que desreferencia un puntero como C? ¿Podría probar esto antes de publicar? – swilliams

5

A menos que tenga una muy enorme número de puntos de vista, escribirlas de forma explícita no es tan malo, desde una perspectiva de estilo.

Puede acortar su ejemplo, sin embargo, utilizando el argumento prefijo de la función patterns:

urlpatterns = patterns('mysite.app.views', 
    (r'^Project/$', 'project'), 
    (r'^Links/$', 'links'), 
    (r'^Profile/$', 'profile'), 
    (r'^Contact/$', 'contact'), 
) 
+0

Esto es cierto, pero ahora me siento comprometido. :) – swilliams

5

que podría ser capaz de utilizar una función especial vista a lo largo de estas líneas:

def router(request, function, module): 
    m =__import__(module, globals(), locals(), [function.lower()]) 
    try: 
     return m.__dict__[function.lower()](request) 
    except KeyError: 
     raise Http404() 

y luego un urlconf como este:

(r'^(?P<function>.+)/$', router, {"module": 'mysite.app.views'}), 

Este código no ha sido probado pero th La idea general debería funcionar, aunque debe recordar:

Explicit es mejor que implícito.

Cuestiones relacionadas