2012-10-02 13 views
11

Ho cercato di capire come definire uno spazio dei nomi dell'URL nidificato (che è look:like:this) in un DjLCour URLConf.Definire gli spazi dei nomi nidificati in un URLConf, per invertire gli URL di Django: qualcuno ha un esempio convincente?

Prima di questo, ho capito come fare un namespace base URL e si avvicinò con this simple example snippet, contenente quello che si potrebbe mettere in un file di 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 la deduzione di cui the Django documentation, in questo caso, non è affatto utile. Sebbene il documento di Django sia fantastico sotto tutti gli altri aspetti, e questa è un'eccezione alla regola, ci sono ancora meno informazioni sulla definizione degli spazi dei nomi degli URL nidificati.

Invece di postare i miei tentativi spaghettificati per capirlo, ho pensato che potrei chiedere se qualcuno ha o sa di un esempio diretto e/o esplicativo di un URLconf che definisce uno spazio dei nomi annidato, che loro potrebbe condividere.

In particolare, sono curioso delle parti nidificate che prefissano la vista: sono necessarie tutte le installate applicazioni Django?

†) Per i curiosi, ecco un esempio (probabilmente un po 'imperscrutabile): http://imgur.com/NDn9H. Stavo cercando di ottenere gli URL stampati in rosso e in verde nella parte inferiore per essere nominati testapp:views:<viewname> anziché solo testapp:<viewname>.

risposta

21

Funziona in modo piuttosto intuitivo. include un urlconf che ha ancora un altro namespace include genererà spazi dei nomi nidificati.

## 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/ 

È un ottimo modo per tenere organizzati gli url. Suppongo che il miglior consiglio che posso dare sia di ricordare che include può prendere direttamente un oggetto patterns (come nel mio esempio) che consente di utilizzare un singolo urls.py e dividere le viste in spazi dei nomi utili senza dover creare più file di URL.

+0

Nizza, che è davvero semplice. Grazie! – fish2000

4

Mentre la risposta di Yuji è corretta, si noti che django.conf.urls.patterns non esiste più (dal momento che Django 1.10) e elenchi semplici vengono invece utilizzati.

Lo stesso esempio urls.py ora dovrebbe essere simile a questo:

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"), 
] 

E ancora utilizzati come:

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

La variabile 'urlpatterns' non ha anche la chiamata di funzione' url'? –

+0

@NathanJones Oops sì, grazie - corretto. –