Django: ¿Cómo creo un enrutamiento genérico de URL para las vistas?
Pregunta
Tengo una aplicación django bastante estándar, y me pregunto cómo configurar el enrutamiento de url para que no tenga que asignar explícitamente cada url a una vista.
Por ejemplo, supongamos que tengo las siguientes vistas: Proyecto, Enlaces, Perfil, Contacto
. Prefiero que mis urlpatterns
no se vean así:
(r'^Project/
Y así sucesivamente. En Pilones , sería tan simple como:
map.connect(':controller/:action/:id')
Y tomaría automáticamente el controlador y la función correctos. ¿Hay algo similar en Django?
, 'mysite.app.views.project'),
(r'^Links/
Y así sucesivamente. En Pilones , sería tan simple como:
<*>
Y tomaría automáticamente el controlador y la función correctos. ¿Hay algo similar en Django?
, 'mysite.app.views.links'),
(r'^Profile/
Y así sucesivamente. En Pilones , sería tan simple como:
<*>
Y tomaría automáticamente el controlador y la función correctos. ¿Hay algo similar en Django?
, 'mysite.app.views.profile'),
(r'^Contact/
Y así sucesivamente. En Pilones , sería tan simple como:
<*>
Y tomaría automáticamente el controlador y la función correctos. ¿Hay algo similar en Django?
, 'mysite.app.views.contact'),
Y así sucesivamente. En Pilones , sería tan simple como:
<*>Y tomaría automáticamente el controlador y la función correctos. ¿Hay algo similar en Django?
Solución
mods = ('Project','Links','Profile','Contact')
urlpatterns = patterns('',
*(('^%s/%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)
Otros consejos
A menos que tenga una cantidad realmente enorme de vistas, escribirlas explícitamente no es tan malo, desde una perspectiva de estilo.
Sin embargo, puede acortar su ejemplo 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'),
)
Es posible que pueda usar una función de vista especial en 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 una urlconf como esta:
(r'^(?P<function>.+)/
Este código no se ha probado, pero la idea general debería funcionar, aunque recuerde:
Explícito es mejor que implícito.
, router, {"module": 'mysite.app.views'}),
Este código no se ha probado, pero la idea general debería funcionar, aunque recuerde:
Explícito es mejor que implícito.