2015-07-17 11 views
23

Ho notato che in Django ci sono due formati di urlpatterns nel file urls.py:Django: formati di urlpatterns in urls.py

urlpatterns = [ 
    url(...), 
    url(...), 
] 

e

urlpatterns = pattern('', 
    url(...), 
    url(...), 
) 

Il primo è un elenco di istanze url e il secondo invoca il modulo pattern con una stringa vuota e un numero di istanze url come parametri.

  1. Qual è la differenza tra i due?
  2. Qual è lo scopo di una stringa vuota nel secondo formato?
  3. Quale si consiglia di utilizzare?

risposta

30

In Django 1.8+, urlpatterns dovrebbe semplicemente essere un elenco di url() s. Questa nuova sintassi funziona anche in 1.7.

urlpatterns = [ 
    url(...), 
    url(...), 
] 

La vecchia sintassi utilizzando patternis deprecated in Django 1.8, e viene rimosso in Django 1.10.

urlpatterns = pattern('', 
    url(...), 
    url(...), 
) 

Con la vecchia sintassi, è possibile fornire un prefisso. L'esempio dato è in the docs

urlpatterns = patterns('news.views', 
    url(r'^articles/([0-9]{4})/$', 'year_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'month_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'article_detail'), 
) 

Tuttavia, utilizzando corde argomenti per la vista è ormai deprecato pure, e si dovrebbe fornire la callable invece.

7

Per the documentation, patterns è:

una funzione che prende un prefisso e un numero arbitrario di URL modelli, e restituisce un elenco di pattern URL nel formato Django esigenze.

Il primo argomento su patterns() è una stringa prefix.

Esso fornisce anche un esempio del perché si potrebbe desiderare di usarlo:

from django.conf.urls import patterns, url 

urlpatterns = patterns('', 
    url(r'^articles/([0-9]{4})/$', 'news.views.year_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'news.views.month_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'news.views.article_detail'), 
) 

In questo esempio, ogni vista ha un prefisso comune - 'news.views'. Invece di digitarlo per ogni voce in urlpatterns, è possibile utilizzare il primo argomento per la funzione patterns() per specificare un prefisso da applicare a ciascuna funzione di visualizzazione.

Con questo in mente, nell'esempio di cui sopra può essere scritto in modo più conciso come:

from django.conf.urls import patterns, url 

urlpatterns = patterns('news.views', 
    url(r'^articles/([0-9]{4})/$', 'year_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'month_archive'), 
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'article_detail'), 
) 

Tuttavia, si noti che questa funzione è deprecata:

Sconsigliata a partire da versione 1.8:

urlpatterns dovrebbe essere un elenco semplice di istanze django.conf.urls.url().

noti che the explanation as to why include (con buona ragione, chiaramente!):

Così patterns() serve a ben poco ed è un fardello quando si insegna nuovi utenti (rispondendo alla domanda del newbie "perché ho bisogno questa stringa vuota come primo argomento a patterns()? ").

+4

Vale la pena notare che i riferimenti alle stringhe per visualizzare le funzioni e la funzione 'patterns()' sono deprecati e verranno rimossi in Django 1.10. Per evitare avvisi di deprecazione, utilizzare invece un elenco semplice. – knbk

+0

@knbk buon punto, aggiunto – jonrsharpe

Problemi correlati