Nella scorsa parte abbiamo visto come abilitare l’interfaccia di admin. Abbiamo notato però che non tutto era esattamente come ce lo aspettavamo. Per prima cosa tutte le tabelle terminavano con una fastidiosa “s” dovuta al plurale inglese, secondo, gli oggetti venivano visualizzati con un anonimo “Artista Object”, “Genere Object” e così via.

Per sistemare questi punti c’è un modo molto semplice.

  • Specificare il metodo __unicode__.
  • Aggiungere l’opzione verbose_name_plural come parametro della classe Meta di ogni oggetto del modello.
  • Impostare LANGUAGE_CODE = 'it-IT' nel file settings.py

Il metodo unicode specifica come verrà visualizzato un oggetto del modello X al posto della dicitura standard “X Object”. Per chi conosce il python è praticamente equivalente a ridefinire il metodo speciale __str__[/cc] di una classe (il metodo [cci]__str__ dei modelli Django chiamano proprio __unicode__).

La classe Meta, invece, è una classe speciale che permette di passare ai modelli delle opzioni particolari. Vedremo altre opzioni nel corso del tutorial. L’opzione che ci interessa ora è verbose_name_plural : se questo valore è None allora viene usato il suffisso “s” come nel caso inglese, altrimenti viene usato il valore della variabile.

Vediamo quindi qualche esempio:

class Artista(models.Model):
    nome = models.CharField(max_length=50)
    cognome = models.CharField(max_length=50)
    ruoli = models.ManyToManyField(Ruolo)

    def __unicode__(self) :
      return u"%s %s" % (self.nome, self.cognome)

    class Meta:
      verbose_name_plural = "Artisti"

Mostro il caso del modello “Artista”. Allo stesso modo intervenite anche su tutti i modelli restanti. Potete vedere il risultato in figura.

Come potete vedere adesso il risultato è molto più accettabile. La prossima volta vedremo come abbozzare un interfaccia pubblica al nostro sito.

 

Quando si sviluppa un applicazione web creare pannelli di admin è solitamente noioso e fastidioso eppure necessario per permettere, ad esempio, al gestore del negozio online che stiamo progettando di aggiungere oggetti al catalogo senza dover conoscere una riga di codice o del funzionamento di un DB. Per fortuna Django ci offre una valida scorciatoia: creare un interfaccia admin con Django ci costa solamente una decina di righe di codice.

Per prima cosa abilitiamo il pannello di admin modificando un paio di righe:

  • Decommentiamo la riga django.contrib.admin di INSTALLED_APPS in settings.py
  • Decommentiamo from django.contrib import admin e admin.autodiscover() da urls.py
  • Decommentiamo (r'^admin/', include(admin.site.urls)), da urlpatterns in settings.py

Per ultimo creiamo ex-novo un file admin.py nella nostra apps con questo contenuto:

from django.contrib import admin
from musicdb.models import *

admin.site.register(Artista)
admin.site.register(Genere)
admin.site.register(Ruolo)
admin.site.register(Gruppo)
admin.site.register(Album)
admin.site.register(Traccia)

Poi avviamo il server e andiamo su

http://localhost:8000/admin/

Per accedere al favoloso pannello di amministratore.

La schermata di login del pannello di admin!

La schermata principale del pannello di amministrazione!

Semplice, facile ma estremamente potente. :)

Tuttavia ci sono ancora alcuni difetti. Ad esempio Django pluralizza le parole aggiungendo il suffisso “s” alla parola come nel caso inglese, cosa che non va bene in italiano; inoltre se apriamo una tabella ci troveremo davanti tanti oggetti anonimi come “Artista object”, “Gruppo object” e così via mentre noi vogliamo che ci indichi, ad esempio, nome e cognome di un artista o il nome del gruppo.

Rimuoveremo tutti questi piccoli difetti la prossima volta con alcune piccole modifiche al modello.

 

Come ogni applicazione che si rispetti, abbiamo bisogno di impostare e generare la struttura dati del nostro programma. La primissima cosa da fare è quella di istruire Django ad utilizzare un database.

Per questa guida sceglieremo PostgreSQL. Per configurarlo potete seguire la guida per installare PostgreSQL.

Una volta installato e configurato il database apriamo il file settings.py e cerchiamo la riga DATABASES e modifichiamola nel modo seguente:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'musicdb',
        'USER': 'vostro_nome',
        'PASSWORD': 'password',
        'HOST': '',
        'PORT': '',
    }
}

Dove vostro_nome e password sono l’username e la password che avete impostato nella fase di configurazione del database. Inoltre dovete creare preventivamente un database di nome “musicdb”. Per completezza spieghiamo tutti i parametri:

  • ENGINE è il modulo di django di backend che si interfaccia con lo specifico database. Scegliamo quello del nostro database.
  • NAME è il nome del database o del file nel caso di SQLite.
  • USER è il nome utente per l’accesso al db (non serve nel caso di SQLite).
  • PASSWORD è la password di accesso.
  • HOST e PORT sono i dati che indicano la posizione e la porta di accesso a db nel caso il database non sia sulla stessa macchina del server.

Assicuratevi anche che sia installato il pacchetto:

python-psycopg2

Necessario per far interfacciare python al DB.

A questo punto non ci resta che creare lo schema del database. Per fare ciò apriamo il file models.py e inseriamo una cosa del tipo:

from django.db import models

# Create your models here.
class Ruolo(models.Model) :
    descrizione = models.CharField(max_length=30)

class Artista(models.Model):
    nome = models.CharField(max_length=50)
    cognome = models.CharField(max_length=50)
    ruoli = models.ManyToManyField(Ruolo)

class Gruppo(models.Model):
    nome = models.CharField(max_length=50)
    membri = models.ManyToManyField(Artista)

class Genere(models.Model):
    descrizione = models.CharField(max_length=30)

class Traccia(models.Model):
    nome = models.CharField(max_length=50)
    durata = models.TimeField()

class Album(models.Model):
    nome = models.CharField(max_length=50)
    gruppo = models.ForeignKey(Gruppo)
    genere = models.ForeignKey(Genere)
    data = models.DateField()
    tracce = models.ManyToManyField(Traccia)

Questo file specifica la struttura delle tabelle del database. Tutto senza scrivere una sola riga di SQL. Vediamo un po il significato di alcuni campi:

  • CharField è un campo di testo semplice. Il parametro max_length specifica il numero massimo di caratteri memorizzabili nel campo.
  • ForeignKey specifica un collegamento uno-a-molti verso un altra tabella. Ad esempio un Album ha un unico Gruppo che lo suona ma un Gruppo può avere uno o più Album nella propria discografia.
  • DateField specifica una data.
  • TimeField specifica un tempo.
  • ManyToMany specifica un collegamento molti-a-molti verso un altra tabella. Ad esempio un Gruppo può avere uno o più Artisti che ne fanno parte, ma un Artista può partecipare a uno o più gruppi.

Ora, rendiamo questo modello un database vero e proprio con il comando:

python manage.py syncdb

Se tutto è andato a buon fine e il modello è valido ci verrà chiesto se vogliamo creare una zona del database per gli utenti. Diciamo di si. Ci verrà chiesto di creare il super-user, creiamolo indicando un nome e la password.

A questo punto possiamo provare il nostro database.

Apriamo la shell di django con

python manage.py shell

E all’interno digitiamo:

from musicdb.models import *
freddie = Autore(nome="Freddie, cognome="Mercury")
freddie.save()

Con pgAdmin3 possiamo facilmente vedere che il cantante è stato aggiunto nella giusta tabella.

Ebbene si. Freddie c'è.

 

Continuiamo il nostro tutorial che ci porterà a implementare una semplice applicazione web per gestire la nostra collezione musicale.

Ora che la base funziona dobbiamo iniziare a scrivere qualcosa di più complesso che una misera pagina di default. A questo scopo ci servono le viste. Le viste non sono altro che quella parte di programma che si occupa di recuperare tutte le informazioni necessarie alla visualizzazione della pagina che poi verranno passate ad un template in modo da essere trasformate in pagine web a tutti gli effetti. Solitamente le viste interrogano un database per recuperare i dati, questa volta invece cominceremo da una semplice vista di test.

La prima cosa da fare è creare una nuova applicazione che chiameremo musicdb in quanto sarà il centro vero e proprio della web application. Un sito complesso è solitamente composto da una o più applicazioni collegate fra loro. Piccoli siti, come quello che stiamo per fare, utilizzano solo un applicazione. Per fare questo, all’interno della cartella principale del sito, digitiamo:

django-admin startapp musicdb

Questo creerà un ulteriore cartella che contiene altri 4 file.

  • __init__.py Sempre il solito file init.
  • models.py Contiene i “modelli” ovvero la struttura del database espressa in python tramite le API di Django.
  • tests.py Contiene dei test per valutare la correttezza di query, associazioni, modelli e viste.
  • views.py Contiene le viste, ovvero quelle funzioni che si occupano di processare le richieste dell’utente generando dei contenuti (tramite i template) che verranno poi inviati al browser.

La seconda cosa da fare è aggiungere la nostra applicazione alle applicazioni del sito. Andiamo nel file “settings.py” e aggiungete ‘musicdb’ alle applicazioni in questo modo:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    'musicdb',
)

Poi dobbiamo scrivere una vista di prova. Andiamo nel file “views.py” dell’applicazione musicdb e inseriamo il seguente codice:

from django.http import HttpResponse

def view_test(request) :
    return HttpResponse("
<h1>Ciao! Questa è la tua applicazione!</h1>
"
)

Ora, dobbiamo solo collegare un URL a questa vista e quindi andiamo nel file “urls.py” e modifichiamo “urlpatterns” in questo modo:

urlpatterns = patterns('',
    # Example:
    # (r'^musicz/', include('musicz.foo.urls')),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # (r'^admin/', include(admin.site.urls)),
    ( r'^test/$', "musicdb.views.view_test"),
)

Il primo elemento della tupla è una espressione regolare che serve ad intercettare l’url e a indirizzarlo alla funzione indicata come secondo elemento della tupla.

A questo punto non ci resta che testare tutto. Avviamo il server (python manage.py runserver) e andiamo all’indirizzo http://localhost:8000/test/. Quello che ci troviamo davanti dovrebbe essere una pagina come quella in figura.

Che bello! Funziona!

 

Vi propongo passo passo un tutorial che ci porterà a realizzare una pagina web dinamica contenente informazioni sulla nostra collezione musicale. In questo modo potrete vedere come prende forma un progetto utilizzando quella meraviglia tecnologica che è Django. Gli unici requisiti sono la conoscenza del Python nella sua forma base (for, if, classi, funzioni, tuple, liste e dizionari). Non ci resta che iniziare a impostare la cartella del progetto e verificare che tutto funzioni.

La prima cosa da fare è andare in una cartella e digitare:

django-admin startproject musicz

Verrà creata una cartella di nome musicz che contiene 4 file.

  • __init__.py è il file che indica all’interprete python di trattare la cartella come un package. Il file è solitamente vuoto e vuoto deve solitamente rimanere.
  • manage.py è un file di servizio che vi offre un interfaccia molto comoda ad alcune “utility” di Django. Ne faremo largamente uso da ora in avanti.
  • setting.py è il file che contiene tutti i settaggi che faremo all’applicazione.
  • urls.py è il file che contiene la specifica mappatura degli urls verso le funzioni del programma.

La cartella contenente i nostri 4 file.

Se tutto è stato fatto correttamente vi basterà digitare

python manage.py runserver

Per avviare il web-server di prova. A questo punto non vi resta che andare all’indirizzo http://localhost:8000/ per vedere un rassicurante messaggio da parte di Django.

Django ci dice che va tutto ok!

 

Come ben sapete sto approfondendo il mio rapporto con Django e, come tutti per tutti framework per applicazioni Web, è fondamentale interagire con un database. Così ho deciso di installarmi in locale un database e, tanto per provare cose nuove, ho deciso di non usare MySQL ma provare PostegreSQL.

A dire la verità la scelta va oltre il semplice diletto. Conoscerete senz’altro le vicissitudini che affliggono MySQL dopo l’acquisizione di Sun da parte di Oracle (già sviluppatore di un noto database). Il futuro di MySQL è quindi incerto e il suo fork comunitario MariaDB, creato dallo stesso programmatore originario di MySQL, sembra ancora lontano dall’avere una comunity stabile e progetti futuri soddisfacenti.

Esiste però un alternativa piuttosto famosa anche se non ha mai avuto la stessa diffusione del suo diretto concorrente: PostgreSQL. Questo db non ha un azienda alle spalle ed è quasi esclusivamente frutto della comunità cosa che comunque ci fa ben sperare che non faccia mai la fine del collega. Inoltre vanta una serie di features che non mi risulta siano presenti in MySQL (ma potrei sempre sbagliarmi) e, soprattutto, risulta più performante se associato a Django.

Detto questo, ci sono tutti i presupposti per provarlo. Il processo di installazione è del tutto automatico, tuttavia, ci sono alcuni passaggi che mi hanno fatto perdere parecchi minuti perché poco chiari. Ed è proprio su quelli che mi concentrerò.

Innanzitutto installiamo il programma:

$ apt-get install postgre

Questo comando installerà automaticamente l’ultima versione stabile del DB (attualmente la 8.4). L’imminente versione 9.0 è anch’essa presente nei repo di Debian Sid tuttavia non installa a causa di una mancata dipendenza.

Una volta installato dobbiamo infilare una serie di comandi che non vi sarebbero mai venuti in mente:

$ su
Password:
# su postgres

Questo vi permetterà di accedere all’utente amministratore di PostgreSQL. Una volta che siamo loggati dobbiamo abilitare il nostro utente “normale” alla modifica del db. Per fare questo dobbiamo creare un utente per il database (che prendono il nome di ruoli).

$ createuser -P
Enter name of role to add: thek3nger
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) y
CREATE ROLE

Ovviamente al posto di “thek3nger” metterete, per semplicità, il nome utente che usate per accedere al vostro sistema.

A questo punto il vostro utente avrà pieno controllo del db e potete farci quello che vi pare. Vi consiglio inoltre un utility grafica per accedere al db:

apt-get install pgadmin3

Così potete evitare di dover imparare a memoria tutti i comandi SQL di PostgreSQL.

 

Come già saprà chi mi segue su Twitter, questa settimana in uno dei miei lampi mi è venuta l’idea di approcciarmi alle web application. Quando uno si affaccia a questo panorama la scelta sembra quasi obbligata: PHP. Tuttavia non avevo voglia di mettermi a studiare intensamente il PHP, sia perché lo trovo sintatticamente bruttino sia per voglia di esplorare degli orizzonti più nascosti.

Così, conoscendo il Python piuttosto bene e conoscendo l’esistenza di Django, mi sono chiesto: perché non approfondire un po questo framework? Detto fatto.

La prima cosa da fare era girare su Google per cercare una specie di guida introduttiva. Ne ho trovate parecchie, tuttavia nessuna che spiegasse in realtà come si potesse installare Django su linux senza perderci mezza giornata. Ho dovuto svelare l’arcano leggendo sui forum e scoprire che è una cavolata immensa:

apt-get install python-django

Fine. Nulla più nulla meno. Nessuna configurazione astrusa, compilazioni varie e configurazioni di server. Basta digitare il comando e il sistema fa tutto da solo. Una volta installato possiamo provarlo. Andiamo in una cartella e digitiamo:

django-admin startproject esempio

Poi entriamo nella cartella e digitiamo:

python manage.py runserver

Per avviare il nostro leggero server di sviluppo (non serve configurare server imponenti come Apache, Django offre di suo un server per provare i vostri siti). Quindi andiamo alla pagina http://127.0.0.1:8000/ per ricevere la conferma che Django è perfettamente installato e configurato.

Tutto qui. Per chi volesse imparare ad usare Django (oltre che a installarlo) può visitare questo ottimo libro on-line: http://www.djangobook.com/en/2.0/

© 2008-2012 SlashCode Suffusion theme by Sayontan Sinha