Skip to content

Latest commit

 

History

History
176 lines (144 loc) · 4.61 KB

README.md

File metadata and controls

176 lines (144 loc) · 4.61 KB

Como importar planilha de excel em algum modelo da aplicação django.

Projeto Inicial

Github: https://github.com/djangomy/config-default-simple.git

Planilha teste

CLIENTES.xlsx

Vamos criar os modelos no seu app.

models.py

from django.db import models

# Create your models here.
class Cliente(models.Model):
    nome = models.CharField(max_length=255)
    documento = models.CharField(max_length=15)
    profissao = models.CharField(max_length=255)
    idade = models.IntegerField()

    def __str__(self):
        return self.nome

class Endereco(models.Model):
    cliente = models.OneToOneField(
        Cliente, on_delete=models.CASCADE, related_name='clientes')
    cep = models.CharField(max_length=10)
    bairro = models.CharField(max_length=255)
    rua = models.CharField(max_length=255)
    complemento = models.CharField(max_length=255)
    numero = models.CharField(max_length=10)
    estado = models.CharField(max_length=2)
    cidade = models.CharField(max_length=255)

    def __str__(self):
        return f"Endereço de {self.cliente.nome}"

requirements.txt

Django==4.1.13 
numpy==1.26.3
openpyxl==3.1.2
pandas==2.2.0
Pillow==9.3.0 

views.py

import pandas as pd
from django.shortcuts import render, redirect
from django.views import View
from .forms import ImportarDadosForm
from .models import Cliente, Endereco

class ImportarDadosView(View):
    template_name = 'importar_dados.html'

    def get(self, request):
        clientes = Cliente.objects.all()
        form = ImportarDadosForm()
        return render(request, self.template_name, {
            'form': form,
            'clientes': clientes
        })

    def post(self, request):
        form = ImportarDadosForm(request.POST, request.FILES)

        if form.is_valid():
            arquivo = request.FILES['arquivo']
            df = pd.read_excel(arquivo)

            for _, row in df.iterrows():
                # Itera sobre as linhas do DataFrame lido do arquivo Excel 
                self.criar_cliente_e_endereco(row)

            return redirect('importar_dados')

        return render(request, self.template_name, {'form': form})

    def criar_cliente_e_endereco(self, row):
        # Use get_or_create para evitar a necessidade de verificar a existência antes de criar
        cliente, criado = Cliente.objects.get_or_create(
            documento=row['documento'],
            defaults={
                'nome': row['nome'],
                'profissao': row['profissao'],
                'idade': row['idade']
            }
        )

        if criado:
            # Cria o endereço associado ao cliente
            Endereco.objects.create(
                cliente=cliente,
                cep=row['cep'],
                bairro=row['bairro'],
                rua=row['rua'],
                complemento=row['complemento'],
                numero=row['numero'],
                estado=row['estado'],
                cidade=row['cidade']
            )

forms.py

from django import forms

class ImportarDadosForm(forms.Form):
    arquivo = forms.FileField()

importar_dados.html

{% extends 'base.html' %}

{% block title %}Importar Dados{% endblock %}

{% block content %}
<div class="container">
  <h2>Importar Dados</h2>
  <form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-primary">Importar</button>
  </form>
 
  {% comment %} Lista de Clientes Importados {% endcomment %}
  <h2>Lista de Clientes</h2>
  <table class="table">
    <thead>
      <tr>
        <th>Nome</th>
        <th>Documento</th>
        <th>Profissão</th>
        <th>Idade</th>
        <th>CEP</th>
        <th>Bairro</th>
        <th>Rua</th>
        <th>Complemento</th>
        <th>Número</th>
        <th>Estado</th>
        <th>Cidade</th>
      </tr>
    </thead>
    <tbody>
      {% for cliente in clientes %}
        <tr>
          <td>{{ cliente.nome }}</td>
          <td>{{ cliente.documento }}</td>
          <td>{{ cliente.profissao }}</td>
          <td>{{ cliente.idade }}</td>
          <td>{{ cliente.clientes.cep }}</td>
          <td>{{ cliente.clientes.bairro }}</td>
          <td>{{ cliente.clientes.rua }}</td>
          <td>{{ cliente.clientes.complemento }}</td>
          <td>{{ cliente.clientes.numero }}</td>
          <td>{{ cliente.clientes.estado }}</td>
          <td>{{ cliente.clientes.cidade }}</td>
        </tr>
      {% endfor %}
    </tbody>
  </table>
</div>
{% endblock %}