Carica un file in Django

Vaibhav Vaibhav 30 gennaio 2023
  1. Imposta l’ambiente Django
  2. Configurazione del progetto Django
  3. Prova il server
  4. Aggiorna il file settings.py
  5. Crea un modello
  6. Crea un modulo per caricare file
  7. Aggiungi visualizzazioni
  8. Configura il file urls.py
  9. test
Carica un file in Django

Questo articolo ti guiderà attraverso come caricare file in Django. Creeremo una semplice applicazione con un semplice modulo per compilare i dettagli e selezionare un file. Inoltre, visualizza tutti i file caricati in una tabella sottostante.

Prima di procedere, si consiglia di creare una nuova cartella o directory per questo progetto per mantenere le cose organizzate.

Imposta l’ambiente Django

Per questo tutorial, utilizzeremo un ambiente virtuale. Non è obbligatorio utilizzare un ambiente virtuale, ma è buona norma disporre di un ambiente virtuale unico per ogni progetto.

Per costruire un ambiente virtuale, abbiamo bisogno di un pacchetto Python, virtualenv. Se non lo hai sul tuo computer, puoi scaricarlo usando il seguente comando.

pip install virtualenv

Ora che hai installato il pacchetto, creiamo l’ambiente.

Per creare un ambiente, eseguire il comando seguente.

virtualenv environment

“ambiente” è il nome dell’ambiente virtuale che abbiamo appena creato. Questo ambiente avrà la versione di Python installata globalmente sulla tua macchina e nessun pacchetto tranne quelli predefiniti.

Per attivare questo ambiente e utilizzarlo, eseguire il comando seguente.

environment\Scripts\activate

Ora, poiché stiamo imparando a conoscere Django, abbiamo bisogno che la libreria Django sia installata. Inoltre, poiché stiamo imparando a caricare i file, abbiamo bisogno di un pacchetto Python aggiuntivo per gestire le immagini. Il nome del pacchetto è Pillow. Installiamo tutte le dipendenze.

pip install django
pip install Pillow

O,

pip3 install django
pip3 install Pillow

Nota che al momento della stesura di questo articolo, l’ultima versione di Django è 3.2.

Configurazione del progetto Django

Per impostare un progetto Django, dobbiamo prima creare un progetto Django, creare un’applicazione, registrarla ed effettuare le migrazioni iniziali.

Per creare un progetto Django, esegui il comando seguente.

django-admin startproject DjangoFileUpload

Ora cambia la directory di lavoro in questo progetto usando il seguente comando.

cd DjangoFileUpload

Per creare un’applicazione all’interno del progetto Django, eseguire il seguente comando.

django-admin startapp Core

O,

python manage.py startapp Core

Core è il nome dell’applicazione.

Per registrare questa applicazione, inserisci il nome dell’applicazione all’interno della lista INSTALLED_APPS nel file settings.py.

  • settings.py
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "Core",  # Here
]

Django ha bisogno di alcuni modelli per funzionare correttamente. Ad esempio, il sistema di autenticazione o il superutente non funzioneranno senza la migrazione iniziale. Quindi, per effettuare le migrazioni iniziali, esegui il seguente comando.

python manage.py migrate

Produzione:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

Prova il server

Per eseguire il server, utilizzare il seguente comando. Se tutto è andato a buon fine, dovresti vedere il tuo server Django in esecuzione su http://127.0.0.1:8000/.

python manage.py runserver

Aggiorna il file settings.py

I file caricati devono essere archiviati da qualche parte. In Django, per impostazione predefinita, tutti i file caricati sono archiviati in una cartella media. Puoi sempre modificare il nome della cartella e l’URL ad essa associato, ma ci atterremo alla convenzione di denominazione predefinita.

Per definire l’URL dei file multimediali, MEDIA_URL, e il percorso della cartella multimediale, MEDIA_ROOT, aggiungere le seguenti istruzioni nel file settings.py.

  • settings.py
import os

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

Non dimenticare di importare il modulo os. Altrimenti, Python genererà un errore.

Crea un modello

Per archiviare i file caricati, dobbiamo creare un modello. Il campo in questo modello conterrà il percorso del file caricato ma non il file stesso.

Creeremo un modello Document per memorizzare i dettagli sui file caricati.

  • Core\models.py
from django.db import models


class Document(models.Model):
    title = models.CharField(max_length=200)
    uploadedFile = models.FileField(upload_to="Uploaded Files/")
    dateTimeOfUpload = models.DateTimeField(auto_now=True)

Il modello ha un campo title di un tipo di carattere per memorizzare un titolo personalizzato per il file caricato e dateTimeOfUpload memorizzerà la data e l’ora del caricamento del file. Il campo data-ora verrebbe impostato automaticamente quando viene creato l’oggetto modello.

Per archiviare i file, utilizziamo FileField(). Questo tipo copre tutti i tipi di file. Ma se desideri essere un po’ specifico con le immagini, puoi utilizzare ImageField() per memorizzare le immagini. Per tutti gli altri campi, devi attenerti a FileField().

Il parametro upload_to viene utilizzato per definire la cartella, dove i file di questo modello verranno caricati all’interno della cartella media.

Prima di utilizzare questo modello, dobbiamo effettuare migrazioni e migrarle. Per questo, esegui i due comandi seguenti.

python manage.py makemigrations
python manage.py migrate

Crea un modulo per caricare file

All’interno dell’applicazione o della cartella Core, crea una nuova cartella, ovvero templates. All’interno di questa cartella, crea un’altra cartella, ovvero Core. Questo dovrebbe essere il nome della tua applicazione. Infine, crea un nuovo file all’interno di questa cartella, ovvero upload-file.html.

Ora dovresti avere una struttura di file come questa.

DjangoFileUpload/
    DjangoFileUpload/
        __init__.py
        asgi.py
        settings.py
        urls.py
        wsgi.py
    db.sqlite3
    gestire.py
    Nucleo/
        migrazioni/
        modelli/
            Nucleo/
                upload-file.html
        __init__.py
        admin.py
        app.py
        modelli.py
        test.py
        views.py

All’interno di upload-file.html, aggiungi il seguente codice HTML.

  • Core\templates\Core\upload-file.html
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Django File Upload</title>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');

        * {
            font-family: "Roboto";
        }

        body {
            background-color: #F5F5F5;
        }

        form {
            background-color: #FFFFFF;
            padding: 25px;
        }

        table {
            width: 100%; 
            text-align: center;
            margin-top: 25px;
            padding: 25px;
            background-color: #FFFFFF;
        }

        table tr td {
            padding-top: 15px;            
        }
    </style>
</head>
<body>
    <form action="{% url 'Core:uploadFile' %}" method="POST" enctype="multipart/form-data">
        <input type="text" name="fileTitle" placeholder="Enter a title">
        <input type="file" name="uploadedFile">
        {% csrf_token %}
        <input type="submit" value="Upload">
    </form>
    <table>
        <tr>
            <th>ID</th>
            <th>Title</th>
            <th>File Path</th>
            <th>Upload Date & Time</th>
        </tr>
        {% for file in files %}
            <tr>
                <td>{{ file.id }}</td>
                <td>{{ file.title }}</td>
                <td>{{ file.uploadedFile.url }}</td>
                <td>{{ file.dateTimeOfUpload }}</td>
            </tr>
        {% endfor %}
    </table>
</body>
</html>

All’interno della tabella, verranno visualizzati alcuni dettagli sui file caricati.

Aggiungi visualizzazioni

Per visualizzare il modello HTML e le informazioni su di esso e archiviare e gestire i caricamenti di file, creeremo una vista uploadFile().

Fare riferimento al codice seguente

  • Core\views.py
from . import models
from django.shortcuts import render


def uploadFile(request):
    if request.method == "POST":
        # Fetching the form data
        fileTitle = request.POST["fileTitle"]
        uploadedFile = request.FILES["uploadedFile"]

        # Saving the information in the database
        document = models.Document(title=fileTitle, uploadedFile=uploadedFile)
        document.save()

    documents = models.Document.objects.all()

    return render(request, "Core/upload-file.html", context={"files": documents})

Questa vista rende il modello HTML che abbiamo appena creato nella sezione precedente. Il modulo nel modello HTML viene inviato allo stesso URL e gestito in questa vista. Se il metodo della richiesta è POST, recuperiamo le informazioni inserite nel modulo e il file caricato, memorizziamo tali informazioni nel modello e salviamo il modello.

Altrimenti, nel caso generale, recuperiamo tutti i file che sono stati caricati e li inviamo in un dizionario contestuale da visualizzare sul modello HTML.

Configura il file urls.py

Infine, impostiamo gli URL. Prima di procedere, crea un nuovo file, ovvero urls.py all’interno dell’applicazione o della cartella Core. Questo file conterrà tutti gli URL associati a questa applicazione Django. È una buona pratica avere un file urls.py separato per ogni applicazione Django.

All’interno di questo file, aggiungi il seguente codice.

from . import views
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static

app_name = "Core"

urlpatterns = [
    path("", views.uploadFile, name="uploadFile"),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Abbiamo aggiunto un pattern URL per il modello HTML upload-file.html. Inoltre, abbiamo aggiunto un altro URL per i file multimediali. Useremo le variabili costanti che abbiamo dichiarato nel file settings.py.

Poiché abbiamo creato un nuovo file urls.py all’interno dell’applicazione Core, dobbiamo collegare gli URL definiti qui con il progetto principale.

Per farlo, aggiungi la seguente istruzione all’interno della lista urlpatterns in DjangoFileUpload\urls.py

path("", include("Core.urls")),

Il tuo file dovrebbe assomigliare a questo.

File: DjangoFileUpload\urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", include("Core.urls")),
]

test

Congratulazioni! Ora è il momento di testare il progetto. Segui i passaggi seguenti.

  • Avvia il server usando il comando - python manage.py runserver
  • Vai all’URL http://127.0.0.1:8000/
  • Compila il modulo con un titolo, seleziona un file e invia il modulo.

Ora dovresti vedere alcuni dettagli sul file nella tabella sotto il modulo.

Inoltre, se controlli la tua directory di lavoro, vedrai che è stata creata una cartella con il nome di media e all’interno di questa cartella c’è un’altra cartella con il nome di Uploaded Files. Questa cartella contiene tutti i file caricati.

Puoi caricare foto, video, programmi, PDF, file JSON, file HTML, ecc. Tieni presente che il tempo di caricamento dipende dalla dimensione del file, quindi abbi pazienza durante il caricamento.

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.