Olá pessoal! Neste artigo, quero compartilhar com vocês o projeto Cars, meu primeiro projeto usando Django. Desenvolvido no início do meu aprendizado, ele é baseado no projeto do curso Django Master. Fiz diversas modificações, principalmente nos aspectos visuais e lógicos, como a inclusão da integração com a API Gemini.

O Cars é uma aplicação de marketplace para carros, semelhante a plataformas como OLX e Webmotors, com todas as funcionalidades básicas necessárias:

  • CRUD de Marcas
  • CRUD de Carros
  • CRUD de Usuários
  • Inventário de Carros
  • Autenticação de Usuário
  • Integração com OpenAI
  • Integração com GeminiAPI (para gerar descrições de venda dos carros)

Inicialmente, o projeto foi publicado na AWS EC2 com um banco de dados PostgreSQL. Porém, para reduzir custos de hospedagem, migrei para a OVHCloud, onde também hospedo este blog.


Aprendizados no Desenvolvimento

O desenvolvimento deste projeto proporcionou uma imersão em conceitos essenciais do Django. Vou compartilhar os mais importantes a seguir.

Arquitetura MTV (Model-Template-View)

A arquitetura MTV é o coração do Django:

  1. Client Request: O cliente (geralmente um navegador) faz uma requisição a uma URL especificada no arquivo urls.py.
  2. View: Essa URL se conecta a uma view definida no views.py.
  3. Model: A view interage com o modelo (models.py) para buscar dados no banco de dados usando o ORM.
  4. Template: Os dados são processados na view e renderizados em templates HTML com a Django Template Language.
  5. Response: O servidor envia a página HTML gerada de volta ao cliente.

A combinação de SSR (Server Side Rendering) com a arquitetura MTV torna o Django robusto e eficiente para desenvolvimento fullstack.

Django Template Language (DTL)

A Django Template Language permite usar código Python dentro de arquivos HTML. Com ela, é possível:

  • Utilizar estruturas de repetição (for, while).
  • Fazer condicionais (if, elif, else).
  • Renderizar variáveis de contexto enviadas pela view.

Como o processamento ocorre no servidor, o navegador recebe apenas o HTML final, aumentando a segurança e a eficiência do sistema. Comparativamente, ela é similar ao Jinja2 usado no Flask.

Class-Based Views (CBVs)

As Class-Based Views (CBVs) tornam o Django altamente produtivo, especialmente para startups e projetos de pequeno e médio porte. Ao invés de escrever views como funções, é possível criar classes que herdam métodos e atributos predefinidos, simplificando o código e melhorando sua organização.

Exemplo de CBVs para um CRUD:

  • CreateView: Cria um novo objeto no banco de dados.
  • ListView: Lista objetos existentes.
  • DetailView: Mostra os detalhes de um objeto.
  • UpdateView: Atualiza um objeto existente.
  • DeleteView: Remove um objeto do banco.

A extensão das CBVs com Mixins adiciona ainda mais flexibilidade. Por exemplo, é possível combinar um ListView com um FormMixin para listar objetos e criar novos na mesma view.

Django ORM

O Django ORM (Object-Relational Mapping) conecta os modelos Python ao banco de dados, permitindo:

  • Criar modelos com classes Python.
  • Gerar tabelas automaticamente no banco de dados.
  • Executar consultas com querysets.

Exemplo de modelo:

from django.db import models

class Car(models.Model):
    brand = models.ForeignKey('Brand', on_delete=models.CASCADE)
    model = models.CharField(max_length=100)
    year = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    
    def __str__(self):
        return f"{self.brand.name} {self.model} ({self.year})"

Consulta com queryset:

cars = Car.objects.filter(price__lt=50000).order_by('year')

Django Forms

Os Django Forms são essenciais para lidar com entradas de usuários. Existem duas abordagens principais:

  • Forms Baseados em Classe: Mais flexíveis e recomendados para formulários complexos.
  • ModelForms: Criados diretamente a partir de modelos, ideais para formularários baseados em dados de banco.

Django Shell

O Django Shell é uma ferramenta poderosa para testar interações com o banco de dados e depurar funcionalidades durante o desenvolvimento.

Exemplo de uso:

python manage.py shell

Dentro do shell, é possível manipular modelos, criar objetos e testar consultas.

Django Signals

Os Django Signals permitem executar código automaticamente em resposta a eventos no banco de dados. Exemplos comuns incluem:

  • Criar perfis de usuários automaticamente após o registro.
  • Atualizar estoques após uma venda.

Exemplo de signal:

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Car

@receiver(post_save, sender=Car)
def notify_new_car(sender, instance, created, **kwargs):
    if created:
        print(f"Novo carro adicionado: {instance}")

Django Admin

O Django Admin é uma das funcionalidades mais poderosas da plataforma. Ele fornece uma interface gráfica pronta para gerenciar dados do sistema sem necessidade de codificação adicional.

Recursos:

  • Customização de campos exibidos.
  • Filtros e buscas dinâmicas.
  • Integração com autenticação.

Exemplo de customização no admin:

from django.contrib import admin
from .models import Car

@admin.register(Car)
class CarAdmin(admin.ModelAdmin):
    list_display = ('brand', 'model', 'year', 'price')
    search_fields = ('model', 'brand__name')
    list_filter = ('year',)

Conclusão

O projeto Cars foi uma experiência enriquecedora que me permitiu aprofundar em conceitos fundamentais do Django. Com ele, aprendi sobre a arquitetura MTV, CBVs, ORM, signals e muito mais.

Se você está iniciando com Django, recomendo fortemente explorar essas funcionalidades, pois elas tornam o desenvolvimento mais organizado e produtivo. Caso tenham dúvidas ou sugestões, deixem nos comentários!