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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top