Implementando Upload de Arquivos com Django e Solucionando Erros de Configuração

Este guia deomnstra como configurar uma funcionalidade de upload de arquivos em uma aplicação Django, abordando uma configruação típica e um erro comum de implementação.

Estrutura do projeto exemplo:

  • meuprojeto/
  • -----> aplicativo5/
  • ---------> urls.py
  • ---------> views.py
  • -----> templates/
  • ---------> formulário_upload.html
  • -----> meuprojeto/
  • ---------> urls.py
  • -----> media/

Primeiramente, configuração das URLs do aplicativo em aplicativo5/urls.py:

from django.urls import path
from aplicativo5 import views as vistas5

nome_aplicativo = 'aplicativo5'

padroes_url = [
    path('processar/', vistas5.processar_envio, name='processar_envio'),
    path('exibir/', vistas5.mostrar_formulario, name='mostrar_formulario'),
]

Esta configuração define duas rotas: uma para exibir o formulário e outra para processar o upload.

Em seguida, a lógica de views em aplicativo5/views.py:

from django.shortcuts import render
from django.http import HttpResponse
import os

def mostrar_formulario(request):
    return render(request, 'templates/formulario_upload.html')

def processar_envio(request):
    if request.method == 'POST':
        arquivo_enviado = request.FILES.get('arquivo', None)
        if arquivo_enviado:
            diretorio_destino = 'media/uploads'
            if not os.path.exists(diretorio_destino):
                os.makedirs(diretorio_destino)
            caminho_completo = os.path.join(diretorio_destino, arquivo_enviado.name)
            with open(caminho_completo, 'wb+') as destino:
                for bloco in arquivo_enviado:
                    destino.write(bloco)
            return HttpResponse('Upload concluído com sucesso!')
        else:
            return HttpResponse('Nenhum arquivo foi selecionado.')

A view processar_envio verifica se o método é POST, recupera o arquivo do request, garante que o diretório exista e salva o conteúdo em blocos para evitar problemas com memória.

O template HTML em templates/formulario_upload.html:

<form enctype="multipart/form-data" action="{% url 'aplicativo5:processar_envio' %}" method="post">
    {% csrf_token %}
    <input type="file" name="arquivo" />
    <br/>
    <input type="submit" value="Enviar" />
</form>

Um erro comum é digitar incorretamente a tag de formulário como <from> em vez de <form>. Isso impede o envio correto, pois o navegador não reconhece o elemento como um formulário funcional. Corrigindo a tag, o upload funciona como esperado.

Por fim, as URLs do projeto principal em meuprojeto/urls.py:

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

padroes_url_projeto = [
    path('admin/', admin.site.urls),
    path('meuapp/', include('aplicativo5.urls')),
]

Isso redireciona requisições para /meuapp/ para as URLs definidas no apilcativo.

Para testar, acesse http://localhost:8000/meuapp/exibir/, selecione um arquivo e clique em enviar. O sistema redirecionará para a rota de processamento e exibirá uma mensagem de sucesso.

Tags: Django Python file-upload HTML-forms web-development

Publicado em 6-16 17:29 por Thomas