SlideShare ist ein Scribd-Unternehmen logo
1 von 39
DJANGO
progetto Reminiscence


 di Andrea Gottardi
Introduzione

•   Breve spiegazione degli elementi principali

•   Trattazione più completa sul repository del
    progetto (GitHub)


•   http://github.com/AndreaGot/reminiscence
Introduzione

•   La base di Django sono i progetti (projects)

•   All’interno di essi trovano spazio le applicazioni
    (apps), che contengono le funzionalità

•   Un progetto può avere tante apps
Per cominciare


•   file settings.py

•   file manage.py

•   cartella main
file settings.py

•   Impostazioni base

•   Ci interessa (praticamente) solo il database

•   Altre impostazioni di importanza secondaria

•   Sconsigliato l’editing di questo file
file manage.py
•   Contiene servizi essenziali per il progetto

         python manage.py comando


•   Esempi di comandi:

        •   dbshell
        •   runserver
        •   shell
        •   syncdb
dbshell

•   Si accede a una shell sqlite3 per inserire query
    SQL direttamente nel database

•   Importante conoscere bene la struttura delle
    tabelle

•   consigliato l’utilizzo di un editor visuale, oppure
    del comando shell
runserver

•   Con questo comando si lancia il server bsato sul
    nostro progetto

•   una volta lanciato ci si connette digitando
             localhost:8000/main/
•   vari URL secondari a cui accedere
runserver - URL

•   localhost:8000/main/ - home page

•   localhost:8000/main/account - creazione

•   localhost:8000/main/login - login

•   localhost:8000/main/add - aggiunta ricordo

•   ce ne sono altri, ma sono “di servizio”
shell

•   Si accede a una shell iPython dove poter
    sperimentare le API del progetto

•   utile per testare il funzionamento delle API prima
    di implementarle
shell - API
 •   Servono per poter operare con le tabelle del
     database senza scrivere nemmeno una riga di SQL

 •   Funzionano dopo opportuno import della tabella
     prescelta:


from reminiscence.main.models import Nome
shell - API
              Nome.objects.get(cond)

•Consente di prelevare dalla tabella Nome il record
corrispondente alla condizione

•Questa API prevede il ritorno di un solo record (usare
condizioni univoche)

•Per evitare l’errore da record non trovato serve una
funzione specifica
shell - API
             Nome.objects.filter(cond)


•Consente di prelevare dalla tabella Nome una lista
di record corrispondenti alla condizione

•Per evitare l’errore da record non trovato serve una
funzione specifica
shell - API
    n = Nome(campo1,valore1,campo2,valore2, ...)

•    crea un’istanza di un record della tabella

•    sono obbligatori solo i collegamenti alle FK

•    il record NON è ancora salvato. Per farlo bisogna
     eseguire il seguente comando:
                         n.save()
shell - API
                n.campoX = valoreX

•   siccome n è un’istanza, la si può modificare come
    un qualsiasi oggetto

•   buona norma salvare l’istanza creata prima, poi in
    caso modificare i dati in questo modo. Non
    dimenticate di salvare i dati con:
                       n.save()
syncdb

•   comando già eseguito in sede di creazione

•   salva le tabelle sul database

•   prende le classi del file models.py (che vedremo
    dopo) e le converte in tabelle
cartella main

•   L’applicazione reminiscence vera e propria

•   Il progetto ha le impostazioni “generali”,
    l’applicazione ha le caratteristiche specifiche

•   i file modificabili si trovano qui
cartella main

•   file models.py

•   cartella static

•   cartella templates

•   file urls.py

•   file views.py
file models.py

•   contiene classi python

•   crea la struttura delle tabelle

•   viene interpretato dal comando syncdb
file models.py -
             struttura

class Regione(models.Model):
     regione = models.CharField(max_length=80)
     def __unicode__(self):
          return str(self.regione)
file models.py -
           struttura

•   CharField è l’equivalente del tipo SQL char

•   la funzione __unicode__ serve per
    rappresentare il dato in maniera leggibile
cartella static

•   contiene, come dice il nome, file statici

•   contiene file che concorrono a creare i
    templates

•   in generale vengono inseriti qui file css e js
cartella templates

•   contiene solo pagine HTML

•   queste pagine formeranno le pagine web che
    visualizzeremo

•   il template NON è la pagina web che il
    browser fa vedere
templates - struttura

•   I template sono scritti in HTML

•   eventuali script e fogli di stile sono in static

•   vengono resi dinamici tramite l’inserimento di
    opportuni tag
templates - tag Django

                        {{variabile}}
•   Inserisce il valore di una variabile
                    {{% comando %}}

•   Esegue un comando python (e.g. for)
urls.py


•   contiene una serie di stringhe, ognuna delle
    quali conduce a una pagina


    url(r'^add/', views.add, name='add'),
urls.py - struttura

•   r’^add/’ e l’indirizzo a cui si troverà la pagina

•   views.add è il nome della view da chiamare

•   name è il nome a cui riferirsi nel codice
urls.py

•   Le pagine vengono visualizzate secondo un
    processo ben preciso

•   Verrà spiegato alla fine, una volta appresi tutti i
    componenti
views.py

•   Contiene funzioni python

•   a metà strada tra URLs e templates

•   Una view viene chiamata da un url

•   in quanto funzione, può essere solo ausiliaria
views.py - struttura


ef add(request):
  [...]
     return render(request, 'main/aggiungi/aggiungiRicordo.html')
views.py - struttura

•   request è un dizionario di valori che la
    chiamante passa alla view

•   render è una funzione che trasforma il
    template in pagina statica

•   i tag citati prima vengono tradotti in HTML
rendering
•   Utente (o form HTML) chiama URL

•   URL chiama view

•   view effettua il render del template



•   per questo <a href [...]> non funziona

•   utilizzare {% url ‘main:NomeUrl’ %}
COME FACCIO PER..
modificare template?


•   È sufficiente conoscere alcuni tag HTML

•   Nelle pagine più articolate è necessario, più
    che il codice HTML, modificare JS e CSS
creare un URL?
     url(r'^xxx/', views.yyy, name='zzz'),
•   è sufficiente inserire nel file urls.py una riga
    aggiuntiva con la stringa qui sopra

•   xxx e zzz devono essere univoci

•   yyy deve esistere (altrimenti l’url non va)
creare una view?

•   basta aggiungere una funzione python nel file
    views.py

•   la funzione può fare qualsiasi cosa

•   usare print solo per debug

•   si possono usare le API, con alcune aggiunte
creare una view?

•   Se la view è chiamata da una pagina web è
    possibile raccogliere i dati inseriti in input

     a = request.POST.get(‘nomeform’)

•   i dati devono essere passati con metodo POST
    (specificato nella form HTML)
creare una view?
•   La view deve concludersi sempre con il ritorno
    della render

•   ovviamente deve esistere il template al quale la
    view si riferisce



•   Le view sono solo le funzioni che ritornano
    pagine web
ATTENZIONE


•   per rendere le pagine interattive non bastano
    queste informazioni

•   è necessario procedere con altri metodi
    (JavaScript, AJAX...)

Weitere ähnliche Inhalte

Ähnlich wie Presentazione django reminiscence

Drupal 7 : theming avanzato
Drupal 7 : theming avanzatoDrupal 7 : theming avanzato
Drupal 7 : theming avanzatoTwinbit
 
Creare un tema personalizzato per wordpress
Creare un tema personalizzato per wordpressCreare un tema personalizzato per wordpress
Creare un tema personalizzato per wordpressGGDBologna
 
Smau milano 2012 massimiliano del cero
Smau milano 2012 massimiliano del ceroSmau milano 2012 massimiliano del cero
Smau milano 2012 massimiliano del ceroSMAU
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteGiuseppe Toto
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Eugenio Minardi
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Wellnet srl
 
Sviluppo web con Yii
Sviluppo web con YiiSviluppo web con Yii
Sviluppo web con YiiApuliaSoft
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScriptSinergia Totale
 
Giovambattista Fazioli, 10 more things
Giovambattista Fazioli, 10 more thingsGiovambattista Fazioli, 10 more things
Giovambattista Fazioli, 10 more thingsKnowCamp
 
Corso Python Deltapromo lezione 1
Corso Python Deltapromo   lezione 1Corso Python Deltapromo   lezione 1
Corso Python Deltapromo lezione 1Paolo Ferretti
 
Slide typescript - xe dotnet - Codemotion Rome 2015
Slide typescript - xe dotnet - Codemotion Rome 2015Slide typescript - xe dotnet - Codemotion Rome 2015
Slide typescript - xe dotnet - Codemotion Rome 2015Codemotion
 
Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO
Drupal Day 2012 - DRUPAL 8:  I CAMBIAMENTI CHE CI ASPETTANODrupal Day 2012 - DRUPAL 8:  I CAMBIAMENTI CHE CI ASPETTANO
Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANODrupalDay
 
REST API fantastiche e dove trovarle
REST API fantastiche e dove trovarleREST API fantastiche e dove trovarle
REST API fantastiche e dove trovarleMarco Breveglieri
 
Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitNon solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitMaurizio Delmonte
 
DNM19 Sessione2 Orchard Temi e Layout (Ita)
DNM19 Sessione2 Orchard Temi e Layout (Ita)DNM19 Sessione2 Orchard Temi e Layout (Ita)
DNM19 Sessione2 Orchard Temi e Layout (Ita)Alessandro Giorgetti
 
CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09Francesco Ronchi
 
Creare API pubbliche, come evitare gli errori comuni
 Creare API pubbliche, come evitare gli errori comuni Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniAndrea Dottor
 

Ähnlich wie Presentazione django reminiscence (20)

Drupal 7 : theming avanzato
Drupal 7 : theming avanzatoDrupal 7 : theming avanzato
Drupal 7 : theming avanzato
 
Creare un tema personalizzato per wordpress
Creare un tema personalizzato per wordpressCreare un tema personalizzato per wordpress
Creare un tema personalizzato per wordpress
 
Smau milano 2012 massimiliano del cero
Smau milano 2012 massimiliano del ceroSmau milano 2012 massimiliano del cero
Smau milano 2012 massimiliano del cero
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parte
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8Come sfruttare tutte le potenzialità di Symfony in Drupal 8
Come sfruttare tutte le potenzialità di Symfony in Drupal 8
 
Sviluppo web con Yii
Sviluppo web con YiiSviluppo web con Yii
Sviluppo web con Yii
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScript
 
Java lezione 17
Java lezione 17Java lezione 17
Java lezione 17
 
Giovambattista Fazioli, 10 more things
Giovambattista Fazioli, 10 more thingsGiovambattista Fazioli, 10 more things
Giovambattista Fazioli, 10 more things
 
Corso Python Deltapromo lezione 1
Corso Python Deltapromo   lezione 1Corso Python Deltapromo   lezione 1
Corso Python Deltapromo lezione 1
 
Slide typescript - xe dotnet - Codemotion Rome 2015
Slide typescript - xe dotnet - Codemotion Rome 2015Slide typescript - xe dotnet - Codemotion Rome 2015
Slide typescript - xe dotnet - Codemotion Rome 2015
 
Sviluppare moduli per il client web
Sviluppare moduli per il client webSviluppare moduli per il client web
Sviluppare moduli per il client web
 
Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO
Drupal Day 2012 - DRUPAL 8:  I CAMBIAMENTI CHE CI ASPETTANODrupal Day 2012 - DRUPAL 8:  I CAMBIAMENTI CHE CI ASPETTANO
Drupal Day 2012 - DRUPAL 8: I CAMBIAMENTI CHE CI ASPETTANO
 
REST API fantastiche e dove trovarle
REST API fantastiche e dove trovarleREST API fantastiche e dove trovarle
REST API fantastiche e dove trovarle
 
Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope ToolkitNon solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
Non solo Django: MVC orientato agli oggetti con Plone e Zope Toolkit
 
DNM19 Sessione2 Orchard Temi e Layout (Ita)
DNM19 Sessione2 Orchard Temi e Layout (Ita)DNM19 Sessione2 Orchard Temi e Layout (Ita)
DNM19 Sessione2 Orchard Temi e Layout (Ita)
 
CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09
 
DDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continuaDDive - 8.5.2 Xpages - L'evoluzione continua
DDive - 8.5.2 Xpages - L'evoluzione continua
 
Creare API pubbliche, come evitare gli errori comuni
 Creare API pubbliche, come evitare gli errori comuni Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuni
 

Presentazione django reminiscence

  • 2. Introduzione • Breve spiegazione degli elementi principali • Trattazione più completa sul repository del progetto (GitHub) • http://github.com/AndreaGot/reminiscence
  • 3. Introduzione • La base di Django sono i progetti (projects) • All’interno di essi trovano spazio le applicazioni (apps), che contengono le funzionalità • Un progetto può avere tante apps
  • 4. Per cominciare • file settings.py • file manage.py • cartella main
  • 5. file settings.py • Impostazioni base • Ci interessa (praticamente) solo il database • Altre impostazioni di importanza secondaria • Sconsigliato l’editing di questo file
  • 6. file manage.py • Contiene servizi essenziali per il progetto python manage.py comando • Esempi di comandi: • dbshell • runserver • shell • syncdb
  • 7. dbshell • Si accede a una shell sqlite3 per inserire query SQL direttamente nel database • Importante conoscere bene la struttura delle tabelle • consigliato l’utilizzo di un editor visuale, oppure del comando shell
  • 8. runserver • Con questo comando si lancia il server bsato sul nostro progetto • una volta lanciato ci si connette digitando localhost:8000/main/ • vari URL secondari a cui accedere
  • 9. runserver - URL • localhost:8000/main/ - home page • localhost:8000/main/account - creazione • localhost:8000/main/login - login • localhost:8000/main/add - aggiunta ricordo • ce ne sono altri, ma sono “di servizio”
  • 10. shell • Si accede a una shell iPython dove poter sperimentare le API del progetto • utile per testare il funzionamento delle API prima di implementarle
  • 11. shell - API • Servono per poter operare con le tabelle del database senza scrivere nemmeno una riga di SQL • Funzionano dopo opportuno import della tabella prescelta: from reminiscence.main.models import Nome
  • 12. shell - API Nome.objects.get(cond) •Consente di prelevare dalla tabella Nome il record corrispondente alla condizione •Questa API prevede il ritorno di un solo record (usare condizioni univoche) •Per evitare l’errore da record non trovato serve una funzione specifica
  • 13. shell - API Nome.objects.filter(cond) •Consente di prelevare dalla tabella Nome una lista di record corrispondenti alla condizione •Per evitare l’errore da record non trovato serve una funzione specifica
  • 14. shell - API n = Nome(campo1,valore1,campo2,valore2, ...) • crea un’istanza di un record della tabella • sono obbligatori solo i collegamenti alle FK • il record NON è ancora salvato. Per farlo bisogna eseguire il seguente comando: n.save()
  • 15. shell - API n.campoX = valoreX • siccome n è un’istanza, la si può modificare come un qualsiasi oggetto • buona norma salvare l’istanza creata prima, poi in caso modificare i dati in questo modo. Non dimenticate di salvare i dati con: n.save()
  • 16. syncdb • comando già eseguito in sede di creazione • salva le tabelle sul database • prende le classi del file models.py (che vedremo dopo) e le converte in tabelle
  • 17. cartella main • L’applicazione reminiscence vera e propria • Il progetto ha le impostazioni “generali”, l’applicazione ha le caratteristiche specifiche • i file modificabili si trovano qui
  • 18. cartella main • file models.py • cartella static • cartella templates • file urls.py • file views.py
  • 19. file models.py • contiene classi python • crea la struttura delle tabelle • viene interpretato dal comando syncdb
  • 20. file models.py - struttura class Regione(models.Model): regione = models.CharField(max_length=80) def __unicode__(self): return str(self.regione)
  • 21. file models.py - struttura • CharField è l’equivalente del tipo SQL char • la funzione __unicode__ serve per rappresentare il dato in maniera leggibile
  • 22. cartella static • contiene, come dice il nome, file statici • contiene file che concorrono a creare i templates • in generale vengono inseriti qui file css e js
  • 23. cartella templates • contiene solo pagine HTML • queste pagine formeranno le pagine web che visualizzeremo • il template NON è la pagina web che il browser fa vedere
  • 24. templates - struttura • I template sono scritti in HTML • eventuali script e fogli di stile sono in static • vengono resi dinamici tramite l’inserimento di opportuni tag
  • 25. templates - tag Django {{variabile}} • Inserisce il valore di una variabile {{% comando %}} • Esegue un comando python (e.g. for)
  • 26. urls.py • contiene una serie di stringhe, ognuna delle quali conduce a una pagina url(r'^add/', views.add, name='add'),
  • 27. urls.py - struttura • r’^add/’ e l’indirizzo a cui si troverà la pagina • views.add è il nome della view da chiamare • name è il nome a cui riferirsi nel codice
  • 28. urls.py • Le pagine vengono visualizzate secondo un processo ben preciso • Verrà spiegato alla fine, una volta appresi tutti i componenti
  • 29. views.py • Contiene funzioni python • a metà strada tra URLs e templates • Una view viene chiamata da un url • in quanto funzione, può essere solo ausiliaria
  • 30. views.py - struttura ef add(request): [...] return render(request, 'main/aggiungi/aggiungiRicordo.html')
  • 31. views.py - struttura • request è un dizionario di valori che la chiamante passa alla view • render è una funzione che trasforma il template in pagina statica • i tag citati prima vengono tradotti in HTML
  • 32. rendering • Utente (o form HTML) chiama URL • URL chiama view • view effettua il render del template • per questo <a href [...]> non funziona • utilizzare {% url ‘main:NomeUrl’ %}
  • 34. modificare template? • È sufficiente conoscere alcuni tag HTML • Nelle pagine più articolate è necessario, più che il codice HTML, modificare JS e CSS
  • 35. creare un URL? url(r'^xxx/', views.yyy, name='zzz'), • è sufficiente inserire nel file urls.py una riga aggiuntiva con la stringa qui sopra • xxx e zzz devono essere univoci • yyy deve esistere (altrimenti l’url non va)
  • 36. creare una view? • basta aggiungere una funzione python nel file views.py • la funzione può fare qualsiasi cosa • usare print solo per debug • si possono usare le API, con alcune aggiunte
  • 37. creare una view? • Se la view è chiamata da una pagina web è possibile raccogliere i dati inseriti in input a = request.POST.get(‘nomeform’) • i dati devono essere passati con metodo POST (specificato nella form HTML)
  • 38. creare una view? • La view deve concludersi sempre con il ritorno della render • ovviamente deve esistere il template al quale la view si riferisce • Le view sono solo le funzioni che ritornano pagine web
  • 39. ATTENZIONE • per rendere le pagine interattive non bastano queste informazioni • è necessario procedere con altri metodi (JavaScript, AJAX...)