Carregar um arquivo no Django
- Definir o ambiente Django
- Configurar Projeto Django
- Teste o servidor
-
Atualizar arquivo
settings.py - Crie um modelo
- Crie um formulário para enviar arquivos
- Adicionar visualizações
-
Configure o arquivo
urls.py - Testando
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.
