Prima di Django
Scegliere i nomi per il progetto in Django
Ricoda di pensare prima al nome del progetto e dei componenti. Non inserire nomi che possono andare in conflitto con lo stesso Django, come django e test.
Dove mettere il codice?
Non è una buona idea inserire il codice Python nella root del tuo server web, perché rischi la possibilità che le persone possano visualizzare il tuo codice sul web. Non va bene per la sicurezza. Metti il tuo codice in una directory al di fuori della root del documento, come /home/mycod
Avviare il progetto
Iniziamo nel creare un progetto Django
django-admin startproject mysite
Mappa del progetto iniziale
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
- la cartella iniziale mysite/ ingloba tutto il progetto, il suo nome non va ad interferire con Django è può essere rinominata anche successivamente.
- manage.py ti consente di interagire con il progetto Django in vari modi .
Avviamo il server
entriamo nella cartella di progetto e avviamo il progetto
cd mysite
python manage.py runserver
La shell ci ritornerà questo messaggio:
Performing system checks...
System check identified no issues (0 silenced).
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
May 21, 2022 - 15:50:53
Django version 4.0, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Se andiamo all’indirizzo http://127.0.0.1:8000/ che ci indica (è un indirizzo locale) vedremo la finestra di Welcome dedicata a Django, in alternativa il progetto non è stato creato correttamente ed avremo una pagina di errore.
Se vogliamo cambiare porta possiamo specificarla nel comando di apertura server:
python manage.py runserver 8080
Il server si riaggiorna automaticamente durante la programmazione e non serve riavviarlo o aggiornare la pagina.
Creare un’app di votazioni
Applicazione vs Progetto in Django
L’applicazione in un progetto Django ha una specifica attività, mentre un progetto è un contenitore di configurazioni. Possiamo avere più app in un progetto ma non più progetti collegati all’app.
Creare l’app
python manage.py startapp polls
Ora è stata aggiunta una cartella al nostro pack con questa struttura:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
Scrivere la prima view
Nel file polls/views.py scrivere:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
Ora per richiamare la views, dobbiamo aggiungere il file urls.py all’interno della cartella polls.
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
Il passo successivo è puntare l'URL di configurazione al modulo polls.urls nel file della cartella di progetto mysite/urls.py. Aggiungeremo all'importazione django.ulrs anche il modulo include e aggiorniamo la lista degli urlpatterns con il nuovo urls.
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
Appena avrete inserito l’app la Wecome page automatica di Django non sarà più visibile ma dovrete andare all’indirizzo appena aggiunto http://localhost:8000/polls/
Setup di Django
Apri il file mysite/settings.py e potresti dover modificare, essendo in italia, le seguenti voci:
LANGUAGE_CODE = 'it-IT'
TIME_ZONE = 'Europe/Rome'
Sucessivamente dobbiamo fare una migrazione di queste modifiche, con la voce:
python manage.py migrate
Creazione di modelli Django
Un modello è l’unica e definitiva fonte di informazioni sui tuoi dati. Contiene i campi e i comportamenti essenziali dei dati che stai archiviando. Django segue il principio DRY. L’obiettivo è definire il tuo modello di dati in un unico posto e ricavarne automaticamente le cose.
Ciò include le migrazioni: a differenza di Ruby On Rails, ad esempio, le migrazioni sono interamente derivate dal file dei modelli e sono essenzialmente una cronologia che Django può scorrere per aggiornare lo schema del database in modo che corrisponda ai modelli correnti.
Struttura dei nostri modelli
Nella nostra app per sondaggi creeremo due modelli: Domanda e Scelta. Una domanda ha una domanda e una data di pubblicazione. Una Scelta ha due campi: il testo della scelta e un conteggio dei voti. Ogni Scelta è associata a una Domanda.
Questi concetti sono rappresentati dalle classi Python. Modifica il file polls/models.py in modo che assomigli a questo:
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
Attivare i moduli
Le app in Django sono “estendibile” e possono essere inserite in qualsiasi progetto Django.
Per includere l’app nel nostro progetto, dobbiamo aggiungere un riferimento alla sua classe di configurazione nell’impostazione INSTALLED_APPS. La classe PollsConfig si trova nel file polls/apps.py, quindi il suo percorso punteggiato è “polls.apps.PollsConfig“. Modifica il file mysite/settings.py e aggiungi quel percorso punteggiato all’impostazione INSTALLED_APPS.
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Ora Django saprà che deve includere l’app polls. Facciamo partire il comando:
python manage.py makemigrations polls
La shell ci risponderà in questo modo:
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Question
- Create model Choice
Ora vediamo quale SQL verrebbe eseguito dalla migrazione. Il comando sqlmigrate prende i nomi di migrazione e restituisce il loro SQL:
python manage.py sqlmigrate polls 0001
La risposta sarà:
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
"id" serial NOT NULL PRIMARY KEY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL,
"question_id" integer NOT NULL
);
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
Ora eseguiamo una nuova migrazione:
python manage.py migrate