Django

Django é un framework in Python con l’obiettivo di creare un’applicazione in tempi relativamente brevi.

É modulare, quindi aggiungere e rimuovere funzionalitá é veramente semplice.

Start a new project

django-admin startproject mysite

Let’s look at what startproject created:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

These files are:

  • The outer mysite/ root directory is a container for your project.
  • manage.py: A command-line utility that lets you interact with this Django project in various ways. You can read all the details about manage.py in django-admin and manage.py.
  • The inner mysite/ directory is the actual Python package for your project. Its name is the Python package name you’ll need to use to import anything inside it (e.g. mysite.urls).
  • mysite/__init__.py: An empty file that tells Python that this directory should be considered a Python package. If you’re a Python beginner, read more about packages in the official Python docs.
  • mysite/settings.py: Settings/configuration for this Django project. Django settings will tell you all about how settings work.
  • mysite/urls.py: The URL declarations for this Django project; a “table of contents” of your Django-powered site. You can read more about URLs in URL dispatcher.
  • mysite/asgi.py: An entry-point for ASGI-compatible web servers to serve your project. See How to deploy with ASGI for more details.
  • mysite/wsgi.py: An entry-point for WSGI-compatible web servers to serve your project. See How to deploy with WSGI for more details.

Far partire il server

python manage.py runserver server:porta

Ogni volta bisogna creare un app, poiché all’interno di un progetto possono esserci più app.

python manage.py startapp nomeapp

Dentro app:

  • nelle view definisci cosa deve ritornare il server
  • si crea un file chiamato urls.py che è il router

Dentro invece la cartella del progetto si definisce urls.py (non devo crearlo) che utilizza l’app di prima.

Bisogna poi:

  • configurare le impostazioni del db su progetto/settings.py
  • container Docker con postgres installato e funzionante
  • questo è un comodo Dockerfile:
version: '3.8'
services:
  db:
    image: postgres:14.1-alpine
    restart: always
    environment:
      - POSTGRES_DB=.
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=docker
    ports:
      - '5432:5432'
    volumes: 
      - db:/var/lib/postgresql/data
volumes:
  db:
    driver: local

Migrazioni

Ogni volta che si effettua un cambiamento allo schema del db bisogna rifare le migrazioni.

Le migrazioni sono come Django traduce le app installate in tabelle del database.

Quindi, prima si fanno le migrazioni dell’app creata:

python manage.py makemigrations polls

e poi

python manage.py migrate

Vedere SQL eseguito e controllare migrazioni

python manage.py sqlmigrate nomeapp numero

Controllare:

python manage.py check

Modelli

I modelli servono per definire a tutti gli effetti le entità del database.

Vanno definit all’interno di models.py, si usa un approccio a classi e vanno usati campi specifici di Django.

Un piccolo esempio:

from django.db import models
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

Quasi sempre va definito il metodo __str__ altrimenti in fase di debug ci ritroviamo una rappresentazione inutile.

Superadmin

Creating an admin user

First we’ll need to create a user who can login to the admin site. Run the following command:

$ python manage.py createsuperuser

Enter your desired username and press enter.

Username: admin

You will then be prompted for your desired email address:

Email address: admin@example.com

The final step is to enter your password. You will be asked to enter your password twice, the second time as a confirmation of the first.

Password: **********
Password (again): *********
Superuser created successfully.

Ok, ma l’app non c’è.

Devo registrare che esiste nella parte admin.py di nomeapp, quindi vado lì:

from .models import Question
 
admin.site.register(Question)

Runnare i test

python manage.py test

Sono contenuto all’interno del file tests.py o al limite in ogni sottocartella.

FAQ

  1. Mentre si definisce un modello, qual è la differenza tra null=True e blank=True?

    • null=True: nel database puo avere campo null, ma non in un form di inserimento
    • blank=True: lo marca come non obbligatorio, ad esempio in un form
  2. Come effettuo un aggiornamento di un’applicazione Django? Come faccio ad aggiornare un’applicazione Django paleolitico al giorno d’oggi?

    • nel progetto, installa con pip django-upgrade e runna git ls-files -- '*.py' | xargs django-upgrade --target-version 4.2
    • dovrai comunque metterci le mani, in quanto non riuscirà a fare tutto il lavoro per te