Django - Mappatura URL

Ora che abbiamo una visione di lavoro come spiegato nei capitoli precedenti. Vogliamo accedere a quella vista tramite un URL. Django ha il suo modo di mappare gli URL ed è fatto modificando il file url.py del progetto(myproject/url.py). Il file url.py ha il seguente aspetto:

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
)

Quando un utente effettua una richiesta per una pagina sulla tua app web, il controller Django prende il posto di cercare la vista corrispondente tramite il file url.py, quindi restituisce la risposta HTML o un errore 404 non trovato, se non trovato. In url.py, la cosa più importante è il file"urlpatterns"tupla. È dove definisci la mappatura tra URL e visualizzazioni. Una mappatura è una tupla in pattern URL come -

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)

La linea contrassegnata mappa l'URL "/ home" alla vista hello creata nel file myapp / view.py. Come puoi vedere sopra una mappatura è composta da tre elementi:

  • The pattern- Una regexp che corrisponde all'URL che desideri venga risolto e mappato. Tutto ciò che può funzionare con il modulo "re" di python è idoneo per il pattern (utile quando si desidera passare parametri tramite url).

  • The python path to the view - Come quando importi un modulo.

  • The name- Per eseguire l'inversione dell'URL, dovrai utilizzare pattern URL con nome come negli esempi precedenti. Una volta fatto, avvia il server per accedere alla tua visualizzazione tramite: http: //127.0.0.1/hello

Organizzazione dei tuoi URL

Finora, abbiamo creato gli URL nel file "myprojects / url.py", tuttavia, come affermato in precedenza su Django e sulla creazione di un'app, il punto migliore era poter riutilizzare le applicazioni in diversi progetti. Puoi facilmente vedere qual è il problema, se stai salvando tutti i tuoi URL nel file "projecturl.py". Quindi la migliore pratica è creare un "url.py" per applicazione e includerlo nel file url.py dei nostri progetti principali (prima abbiamo incluso URL di amministrazione per l'interfaccia di amministrazione).

Com'è fatto?

Dobbiamo creare un file url.py in myapp usando il seguente codice:

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

urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)

Quindi myproject / url.py cambierà nel seguente:

from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
   #Examples
   #url(r'^$', 'myproject.view.home', name = 'home'),
   #url(r'^blog/', include('blog.urls')),

   url(r'^admin', include(admin.site.urls)),
   url(r'^myapp/', include('myapp.urls')),
)

Abbiamo incluso tutti gli URL dall'applicazione myapp. Il file home.html a cui si accedeva tramite "/ hello" ora è "/ myapp / hello", che è una struttura migliore e più comprensibile per l'app web.

Ora immaginiamo di avere un'altra vista in myapp "morning" e di voler mapparla in myapp / url.py, quindi cambieremo myapp / url.py in -

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

urlpatterns = patterns('',
   url(r'^hello/', 'myapp.views.hello', name = 'hello'),
   url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)

Questo può essere ri-fattorizzato per:

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

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),)

Come puoi vedere, ora usiamo il primo elemento del nostro urlpatternstupla. Questo può essere utile quando vuoi cambiare il nome della tua app.

Invio di parametri alle viste

Ora sappiamo come mappare gli URL, come organizzarli, ora vediamo come inviare i parametri alle viste. Un esempio classico è l'esempio dell'articolo (si desidera accedere a un articolo tramite "/ articles / article_id").

Il passaggio dei parametri viene eseguito acquisendoli con il file regexpnel pattern URL. Se abbiamo una vista come la seguente in "myapp / view.py"

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

Vogliamo mapparlo in miaapp / url.py così possiamo accedervi tramite "/ miaapp / articolo / ID articolo", abbiamo bisogno di quanto segue in "miaapp / url.py" -

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

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)

Quando Django vedrà l'url: "/ miaapp / articolo / 42" passerà i parametri '42' alla vista viewArticle e nel tuo browser dovresti ottenere il seguente risultato:

Nota che l'ordine dei parametri è importante qui. Supponiamo di voler l'elenco degli articoli di un mese di un anno, aggiungiamo una vista viewArticles. Il nostro view.py diventa -

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
   return render(request, "hello.html", {})

def viewArticle(request, articleId):
   text = "Displaying article Number : %s"%articleId
   return HttpResponse(text)

def viewArticle(request, month, year):
   text = "Displaying articles of : %s/%s"%(year, month)
   return HttpResponse(text)

Il corrispondente url.py il file sarà simile a -

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

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)

Ora quando vai su "/ miaapp / articoli / 12/2006 /" otterrai "Visualizzazione di articoli di: 2006/12" ma se inverti i parametri non otterrai lo stesso risultato.

Per evitare ciò, è possibile collegare un parametro URL al parametro di visualizzazione. Per questo, il nostrourl.py diventerà -

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

urlpatterns = patterns('myapp.views',
   url(r'^hello/', 'hello', name = 'hello'),
   url(r'^morning/', 'morning', name = 'morning'),
   url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
   url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)