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.