2012-10-02 23 views
11

He estado tratando de encontrar la forma de definir un espacio de nombres URL anidado (que look:like:this) en un Django URLConf.Definición de espacios de nombres anidados en un URLConf, para revertir las URL de Django: ¿alguien tiene un ejemplo convincente?

Antes de esto, me di cuenta de cómo hacer un espacio de nombres URL básica y se acercó con this simple example snippet, que contiene lo que se podría poner en un archivo urls.py:

from django.conf.urls import patterns, include, url 

# you can only define a namespace for urls when calling include(): 

app_patterns = patterns('', 
    url(r'^(?P<pk>[\w\-]+)/$', 'yourapp.views.your_view_function', 
     name="your-view"), 
) 

urlpatterns = patterns('', 
    url(r'^view-function/', include(app_patterns, 
     namespace='yournamespace', app_name='yourapp')), 
) 

""" 

    You can now use the namespace when you refer to the view, e.g. a call 
    to `reverse()`: 

    # yourapp/models.py 

    from django.core.urlresolvers import reverse 

    # ... 

    class MyModel(models.Model): 

     def get_absolute_url(self): 
     return reverse('signalqueue:exception-log-entry', kwargs=dict(pk=self.pk)) 

""" 

... w/r/t de la deducción de los cuales the Django documentation fue, en este caso, nada útil. Si bien el documento de Django es fantástico en todos los demás aspectos, y esta es una excepción a la regla, hay incluso menos información sobre la definición de espacios de nombres de URL anidados.

En lugar de publicar mis intentos espagificados † para resolver esto, pensé que podría preguntar si alguien tiene, o sabe de, un ejemplo directamente coherente y/o autoexplicativo de un URLconf que define un espacio de nombres anidado, que podría compartir.

Específicamente, tengo curiosidad acerca de las partes anidadas que anteponen la vista: necesitan todas instaladas aplicaciones Django?

†) Para los curiosos, he aquí un ejemplo (probablemente algo inescrutable): http://imgur.com/NDn9H. Estaba intentando que las URL impresas en rojo y verde en la parte inferior se llamaran testapp:views:<viewname> en lugar de solo testapp:<viewname>.

Respuesta

21

Funciona de manera bastante intuitiva. include un urlconf que tiene otro espacio de nombre include dará como resultado espacios de nombres anidados.

## urls.py 
nested2 = patterns('', 
    url(r'^index/$', 'index', name='index'), 
) 

nested1 = patterns('', 
    url(r'^nested2/', include(nested2, namespace="nested2"), 
    url(r'^index/$', 'index', name='index'), 
) 

urlpatterns = patterns('', 
    (r'^nested1/', include(nested1, namespace="nested1"), 
) 

reverse('nested1:nested2:index') # should output /nested1/nested2/index/ 
reverse('nested1:index') # should output /nested1/index/ 

Es una gran manera de mantener las URL organizadas. Supongo que el mejor consejo que puedo dar es recordar que include puede tomar un objeto patterns directamente (como en mi ejemplo) que le permite usar un solo urls.py y dividir las vistas en espacios de nombres útiles sin tener que crear múltiples archivos de URL.

+0

Niza, que es de hecho sencillo. ¡Gracias! – fish2000

4

Si bien la respuesta de Yuji es correcta, tenga en cuenta que django.conf.urls.patterns ya no existe (ya que Django 1.10) y las listas simples se utilizan en su lugar.

El mismo ejemplo urls.py ahora debería ser así:

from django.conf.urls import include, url 

nested2 = [ 
    url(r'^index/$', 'index', name='index'), 
] 

nested1 = [ 
    url(r'^nested2/', include(nested2, namespace="nested2"), 
    url(r'^index/$', 'index', name='index'), 
] 

urlpatterns = [ 
    url(r'^nested1/', include(nested1, namespace="nested1"), 
] 

Y todavía se utiliza como:

reverse('nested1:nested2:index') # should output /nested1/nested2/index/ 
reverse('nested1:index') # should output /nested1/index/ 
+0

¿No debería la variable 'urlpatterns' también tener la llamada a la función' url'? –

+0

@NathanJones Vaya, sí, gracias - corregido. –

Cuestiones relacionadas