In questa lezione approfondiamo il meccanismo che ci permette di fornire parametri alle View. Supponiamo di voler passare alla View hello_world
, precedentemente definita, due parametri: nome
e cognome
.
Dobbiamo modificare l'espressione regolare in urlpatterns
nel modo seguente:
( r'^app/helloworld/(w+)/(w+)/$', 'miosito.app.views.hello_world' ),
in questo modo vengono passate le due stringhe dell'URL a hello_world
, che deve essere modificata aggiungendo due parametri alla funzione:
def hello_world(request, nome, cognome): html = '<html><body> <p>Hello '+nome+' '+cognome+'</p> </body></html>' return HttpResponse(html)
Ora puntiamo il browser su
http://localhost:8000/app/helloworld/Mario/Rossi/
e otteniamo un saluto personalizzato:
Da questo esempio possiamo risalire alla sintassi generale per il passaggio dei parametri. Se inseriamo nell'espressione regolare una sottoespressione tra parentesi tonde (ad esempio (.*)
), indichiamo a Django che vogliamo effettuare un passaggio di parametri.
In particolare, immaginiamo di immettere due valori come nel caso precendente e di avere un URL come questo:
app/helloworld/stringa1/stringa2/
Django, ricevuto questo indirizzo, invocherà la funzione:
miosito.app.views.hello_world(request,'stringa1','stringa2')
L'esempio precedente utilizza il metodo più semplice che possiamo usare per passare dei parametri alle View, tale metodo però essere fonte di errori in quanto è fondamentale l'ordine dei parametri sia nell'espressione regolare che identifica l'URL, sia nella funzione Python associata.
Se l'ordine dei parametri nella funzione e nella espressione regolare non è il medesimo, otteniamo degli errori a causa di passaggi di valori a parametri diversi da quelli a cui effettivamente facevano riferimento. Questo è vero soprattutto se i parametri hanno tipi diversi.
Consideriamo l'espressione:
( r'^app/somma/(w+)/(d+)/(d+)/$', 'miosito.app.views.somma' ),
e la funzione seguente:
def somma(request, val1, val2, descrizione): sum = val1 + val2 html = '<html><body> <p>'+descrizione+'='+str(sum)+'</p> </body></html>' return HttpResponse(html)
Se chiamiamo l'URL app/somma/conto/30/50/
Django invoca la funzione:
miosito.app.views.somma(request,'conto',30,50)
Il che genera un errore di tipi poiché, anche se l'espressione regolare viene rispettata, nella funzione si tenta di eseguire l'addizione tra la string 'conto'
e l'intero 30
.
Parametri con nome
Per migliorare le cose è possibile svincolare la definizione della firma della funzione Python dall'ordine dei parametri imposto dall'espressione regolare.
Django fornisce un meccanismo per associare degli identificatori alle espressioni regolari. Ogni identificatore di pattern deve avere il relativo parametro nella View associata.
La sintassi che permette di associare un identificatore ad un pattern presente nella url è la seguente:
(?P<nome>pattern)
dove nome
è l'identificatore di un parametro della View associata all'espressione regolare.
Vediamo subito come utilizzare questo metodo. Riprendiamo l'esempio precedente e modifichiamo la definizione della url nel modo seguente:
( r'^app/somma/(?P<descrizione>w+)/(?P<val1>d+)/(?P<val2>d+)/$', 'miosito.app.views.somma' ),
In questo modo, quando Django riceve la url app/somma/conto/30/50/
invoca la funzione miosito.app.views.somma(request, val1=30, val2=50, descrizione='conto')
e restituisce correttamente il codice html che mostra la somma di val1
e val2
.