Carregar um arquivo no Django

Vaibhav Vaibhav 30 janeiro 2023
  1. Definir o ambiente Django
  2. Configurar Projeto Django
  3. Teste o servidor
  4. Atualizar arquivo settings.py
  5. Crie um modelo
  6. Crie um formulário para enviar arquivos
  7. Adicionar visualizações
  8. Configure o arquivo urls.py
  9. Testando
Carregar um arquivo no Django

Este artigo irá orientá-lo sobre como fazer upload de arquivos no Django. Vamos criar um aplicativo simples com um formulário simples para preencher os detalhes e selecionar um arquivo. Além disso, exiba todos os arquivos carregados em uma tabela abaixo.

Antes de prosseguirmos, é recomendável criar uma nova pasta ou diretório para este projeto para manter as coisas organizadas.

Definir o ambiente Django

Para este tutorial, usaremos um ambiente virtual. Não é obrigatório usar um ambiente virtual, mas é uma boa prática ter um ambiente virtual exclusivo para cada projeto.

Para construir um ambiente virtual, precisamos de um pacote Python, virtualenv. Se você não tiver em sua máquina, você pode baixá-lo usando o seguinte comando.

pip install virtualenv

Agora que você instalou o pacote, vamos criar o ambiente.

Para criar um ambiente, execute o seguinte comando.

virtualenv environment

environment é o nome do ambiente virtual que acabamos de criar. Este ambiente terá a versão Python instalada globalmente em sua máquina e nenhum pacote exceto os padrão.

Para ativar este ambiente e usá-lo, execute o seguinte comando.

environment\Scripts\activate

Agora, como estamos aprendendo sobre Django, precisamos da biblioteca Django instalada. Além disso, como estamos aprendendo a fazer upload de arquivos, precisamos de um pacote Python adicional para lidar com as imagens. O nome do pacote é Pillow. Vamos instalar todas as dependências.

pip install django
pip install Pillow

Ou,

pip3 install django
pip3 install Pillow

Observe que no momento em que este artigo foi escrito, a última versão do Django é 3.2.

Configurar Projeto Django

Para configurar um projeto Django, primeiro temos que criar um projeto Django, criar um aplicativo, registrar esse aplicativo e fazer as migrações iniciais.

Para criar um projeto Django, execute o seguinte comando.

django-admin startproject DjangoFileUpload

Agora, mude o diretório de trabalho para este projeto usando o seguinte comando.

cd DjangoFileUpload

Para criar um aplicativo dentro do projeto Django, execute o seguinte comando.

django-admin startapp Core

Ou,

python manage.py startapp Core

Core é o nome do aplicativo.

Para registrar este aplicativo, insira o nome do aplicativo dentro da lista INSTALLED_APPS no arquivo 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
]

O Django precisa de alguns modelos para funcionar corretamente. Por exemplo, o sistema de autenticação ou superusuário não funcionará sem a migração inicial. Portanto, para fazer as migrações iniciais, execute o seguinte comando.

python manage.py migrate

Resultado:

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

Teste o servidor

Para executar o servidor, use o seguinte comando. Se tudo correu sem erros, você deve ver seu servidor Django rodando em http://127.0.0.1:8000/.

python manage.py runserver

Atualizar arquivo settings.py

Os arquivos carregados precisam ser armazenados em algum lugar. No Django, por padrão, todos os arquivos carregados são armazenados em uma pasta media. Você sempre pode alterar o nome da pasta e o URL associado a ela, mas manteremos a convenção de nomenclatura padrão.

Para definir o URL para os arquivos de mídia, MEDIA_URL, e o caminho para a pasta de mídia, MEDIA_ROOT, adicione as seguintes declarações no arquivo settings.py.

  • settings.py
import os

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

Não se esqueça de importar o módulo os. Caso contrário, o Python gerará um erro.

Crie um modelo

Para armazenar os arquivos carregados, temos que criar um modelo. O campo neste modelo conterá o caminho para o arquivo carregado, mas não o arquivo em si.

Vamos criar um modelo Document para armazenar os detalhes sobre os arquivos carregados.

  • 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)

O modelo tem um campo title de um tipo de caractere para armazenar um título personalizado para o arquivo enviado, e dateTimeOfUpload armazenará a data e hora do upload do arquivo. O campo de data e hora seria definido automaticamente quando o objeto modelo é criado.

Para armazenar os arquivos, estamos usando FileField(). Este tipo cobre todos os tipos de arquivos. Mas se você deseja ser um pouco específico com as imagens, você pode usar o ImageField() para armazenar as imagens. Para todos os outros campos, você deve se limitar a FileField().

O parâmetro upload_to é usado para definir a pasta, onde os arquivos deste modelo serão carregados dentro da pasta media.

Antes de usar este modelo, temos que fazer migrações e migrá-los. Para isso, execute os dois comandos a seguir.

python manage.py makemigrations
python manage.py migrate

Crie um formulário para enviar arquivos

Dentro da aplicação ou pasta Core, crie uma nova pasta, nomeadamente, templates. Dentro desta pasta, crie outra pasta, a saber, Core. Este deve ser o nome do seu aplicativo. Por último, crie um novo arquivo dentro desta pasta, a saber, upload-file.html.

Agora você deve ter uma estrutura de arquivo como esta.

DjangoFileUpload /
    DjangoFileUpload /
        __init__.py
        asgi.py
        settings.py
        urls.py
        wsgi.py
    db.sqlite3
    manage.py
    Testemunho/
        migrações /
        modelos/
            Testemunho/
                upload-file.html
        __init__.py
        admin.py
        apps.py
        models.py
        tests.py
        views.py

Dentro de upload-file.html, adicione o seguinte 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>

Dentro da tabela, mostraremos alguns detalhes sobre os arquivos carregados.

Adicionar visualizações

Para exibir o modelo HTML e as informações sobre ele e armazenar e manipular os uploads de arquivos, criaremos uma visão uploadFile().

Consulte o seguinte código

  • 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})

Essa visualização renderiza o modelo HTML que acabamos de criar na seção anterior. O formulário no modelo HTML é enviado ao mesmo URL e tratado nesta visualização. Se o método da solicitação for POST, buscamos as informações inseridas no formulário e o arquivo carregado, armazenamos essas informações no modelo e salvamos o modelo.

Caso contrário, no caso geral, buscamos todos os arquivos que foram carregados e os enviamos em um dicionário de contexto para exibir no modelo HTML.

Configure o arquivo urls.py

Por último, vamos configurar os URLs. Antes de prosseguir, crie um novo arquivo, a saber, urls.py dentro do aplicativo ou pasta Core. Este arquivo conterá todos os URLs associados a este aplicativo Django. É uma boa prática ter um arquivo urls.py separado para cada aplicativo Django.

Dentro desse arquivo, adicione o código a seguir.

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)

Adicionamos um padrão de URL para o modelo HTML upload-file.html. Além disso, adicionamos mais um URL para os arquivos de mídia. Usaremos as variáveis ​​constantes declaradas no arquivo settings.py.

Uma vez que criamos um novo arquivo urls.py dentro do aplicativo Core, temos que vincular os URLs definidos aqui com o projeto principal.

Para fazer isso, adicione a seguinte instrução dentro da lista urlpatterns em DjangoFileUpload\urls.py

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

Seu arquivo deve ser parecido com isto.

Arquivo: DjangoFileUpload\urls.py

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

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

Testando

Parabéns! Agora é hora de testar o projeto. Siga os passos abaixo.

  • Inicie o servidor usando o comando - python manage.py runserver
  • Vá para o URL http://127.0.0.1:8000/
  • Preencha o formulário com um título, selecione um arquivo e envie o formulário.

Agora você deve ver alguns detalhes sobre o arquivo na tabela abaixo do formulário.

Além disso, se você verificar seu diretório de trabalho, verá que uma pasta com o nome de media foi criada, e dentro desta pasta, há outra pasta com o nome de Uploaded Files. Esta pasta contém todos os arquivos carregados.

Você pode fazer upload de fotos, vídeos, programas, PDFs, arquivos JSON, arquivos HTML, etc. Observe que o tempo de upload depende do tamanho do arquivo, então tenha paciência ao fazer o upload.

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.