💻
Dicas de Django
  • Dica 1 - Django boilerplate e cookiecutter-django
  • Dica 1.1 - Django boilerplate
  • Dica 2 - Django extensions
  • Dica 3 - Django bulk_create e django-autoslug
  • Dica 4 - Django Admin personalizado
  • Dica 5 - Django Admin Date Range filter
  • Dica 6 - Geradores de senhas randômicas - uuid, hashids, secrets
  • Dica 7 - Rodando o ORM do Django no Jupyter Notebook
  • Dica 8 - Conhecendo o Django Debug Toolbar
  • Dica 9 - Escondendo suas senhas python-decouple
  • Dica 10 - Prototipagem de web design (Mockup)
  • Dica 11 - Bootstrap e Bulma + Colorlib
  • Dica 12 - Imagens: pexels e unsplash
  • Dica 13 - Cores
  • Dica 14 - Herança de Templates e Arquivos estáticos
  • Dica 15 - Busca por data no frontend
  • Dica 16 - Filtros com django-filter
  • Dica 17 - Criando comandos personalizados
  • Dica 18 - bulk_create e bulk_update
  • Dica 19 - Criando Issues por linha de comando com a api do github
  • Dica 20 - api github e click
  • Dica 21 - Criando issues por linha de comando com gitlab cli
  • 022-criando-issues-por-linha-de-comando-com-bitbucket-cli
  • Dica 23 - Diferença entre JSON dump, dumps, load e loads
  • Dica 24 - Barra de progresso
  • Dica 25 - Rodando Shell script dentro do Python
  • Dica 26 - Rodando Python dentro do Shell script
  • Dica 27 - Retornando os nomes dos campos do model
  • Dica 28 - Admin: Usando short description
  • Dica 29 - Django Admin: Criando actions no Admin
  • Dica 30 - Django Admin: Editando direto na listview do Admin
  • Dica 31 - Django Admin: Pegando usuário logado no Admin
  • Dica 32 - Django Admin: Sobreescrevendo os templates do Admin
  • Dica 33 - Github cli
  • Dica 34 - Django: custom template tags
  • Dica 35 - Django: passando usuário logado no formulário
  • Dica 36 - Django: visualizando seus modelos com graph models
  • Dica 37 - Faker
  • Dica 38 - Django: Paginação + Filtros
  • Dica 39 - Django Admin: display decorator (Django 3.2+)
  • Dica 40 - Formulários: date, datetime, duration e templatetags de data
  • Dica 41 - django-seed
  • Dica 42 - Custom context processors
  • Dica 43 - django-admin-rangefilter
  • Dica 44 - Django: F() expression
  • Dica 45 - DRF: Scaffold django apis - Django REST framework
  • Dica 46 - DRF: drf-yasg - Yet another Swagger generator
  • Dica 47 - DRF: djoser - Django REST framework
  • Dica 48 - DRF: Reset de Senha com djoser - Django REST framework
  • Dica 49 - DRF: Autenticação via JWT com djoser - Django REST framework
  • Dica 50 - DRF: Django CORS headers
  • Dica 51 - DRF: paginação
  • Dica 52 - DRF: django-filter
  • Dica 53 - DRF: Criando subrota com action
  • 54-django-extensions-mais-comandos
  • Dica 55 - Rodando Django em https localmente com runserver_plus
  • Dica 56 - Django inlineformset_factory + HTMX
  • Dica 57 - Criando API com Django SEM DRF
  • Dica 58 - Rodando PostgreSQL com Docker + Portainer + pgAdmin + Django local para desenvolvimento
  • Dica 59 - Django: Busca por palavras acentuadas ou sem acento
  • Dica 60 - Django: Adicionando atributos extras no formulário
  • Dica 01 - Criando Issues com API do Github (Linux)
  • Dica 02 - Usando http.server
  • Dica 03 - Criando um template com Bulma CSS
  • Dica 04 - Criando um template com Tailwind CSS
  • Dica 05 - htmx simples
  • Dica 06 - Criando o projeto Django
  • Dica 07 - PostgreSQL, pgAdmin e MailHog com docker-compose
  • Dica 08 - Aplicando isort e autopep8
  • Dica 09 - Aplicando djhtml
  • Dica 10 - Criando Makefile
  • Dica 11 - Criando Landpage de produtos
  • 072-012-fale-co-nosco-form-email
  • Dica 13 - Dashboard com Django e Tailwind CSS
  • Dica 14 - Django Custom User com e-mail
  • Dica 15 - Login com e-mail no Django
  • Dica 16 - Logout
  • Dica 17 - Cadastro de Usuários no Django
  • Dica 18 - Esqueci a senha
  • Dica 19.1 - Modelagem - OneToMany - Um pra Muitos - ForeignKey - Chave Estrangeira
  • Dica 19.2 - Modelagem - OneToOne - Um pra Um
  • Dica 19.3 - Modelagem - ManyToMany - Muitos pra Muitos
  • Dica 19.4 - Modelagem - Abstract Inheritance - Herança Abstrata
  • Dica 19.5 - Modelagem - Multi-table Inheritance - Herança Multi-tabela
  • Dica 19.6 - Modelagem - Proxy Model
  • Dica 19.7 - Modelagem - Resumo
  • Dica 20 - Templates
  • Dica 21 - Tentativas de Login
  • Dica 22 - Validação
  • Dica 23 - CRUD de produtos
  • Dica 24 - Alpine.js e Django
  • 091-25-dica-queryset
  • Dica 26 - Paginação e Breadcrumb
  • Dica 27 - Signals
  • Dica 28 - Gerando dados aleatórios com Faker - faker-commerce
  • Dica 29 - Importando CSV
  • 096-30-import-csv-inmemoryuploadedfile
  • Dica 31 - Importando CSV com Pandas
  • Dica 32 - Importando CSV com Dask
  • Dica 33 - Importando XLSX com OpenPyXL
  • 100-34-export-csv
  • Dica 35 - Exportando XLSX mais rápido com pyexcelerate
  • Dica 36 - Exportando CSV e XLSX pelo front no projeto
  • Novidades do Django 5.1
  • Django Router
  • 105-django-52
Powered by GitBook
On this page
  • Novidades do Django 5.2
  • Importação automática dos modelos no shell (Automatic models import in the shell)
  • Composição de Chave Estrangeira (Composite Primary Keys)
  • Minor features
  • Forms — New Inputs
  • JSONArray
  • Templates
  • Alterações incompatíveis com versões anteriores na versão 5.2

Was this helpful?

105-django-52

PreviousDjango Router

Last updated 1 month ago

Was this helpful?

Novidades do Django 5.2

Em 02 de Abril de 2025 saiu o .

Veja o video no YouTube em breve.

Doc:

Github:

Importante: remova a \ no meio das tags.


E eu vou destacar aqui algumas das novidades:

Importação automática dos modelos no shell (Automatic models import in the shell)

Ou digite simplesmente python manage.py shell

python manage.py shell -v 2 é o modo verboso.

Composição de Chave Estrangeira (Composite Primary Keys)

🧳 Exemplo 1: Sistema de Reservas de Passagens

  • Tabela: Reserva

  • Chave composta: (voo_id, passageiro_id)

  • Motivo: Motivo: Um passageiro pode ter várias reservas, e um voo pode ter vários passageiros. A chave composta identifica uma reserva única por voo e passageiro.

🏫 Exemplo 2: Registro de Presença em Aulas

  • Tabela: Presenca

  • Chave composta: (aluno_id, data, aula_id)

  • Motivo: Um aluno só pode ter um registro por aula por dia. Isso evita duplicidade de presença.

classDiagram
  class Aluno {
      +int id
      +string nome
  }

  class Professor {
      +int id
      +string nome
  }

  class Turma {
      +int id
      +string nome
      +int ano
  }

  class Aula {
      +int id
      +date data
      +string horario
      +int turma_id
      +int professor_id
  }

  class Presenca {
      +int aluno_id
      +int aula_id
      +date data_presenca
      +bool presente
      +string observacao
  }

  Aluno "1" --> "0..*" Presenca : registra
  Aula "1" --> "0..*" Presenca : possui
  Turma "1" --> "0..*" Aula : contém
  Professor "1" --> "0..*" Aula : ministra
  Aluno "0..*" --> "1" Turma : pertence

  note for Presenca "Chave composta: aluno_id + data_presenca + aula_id"

models.py

Agora veja o arquivo apps/school/models.py

admin.py

Erro ao registrar no admin:

admin.site.register(Attendance)

Resultado:

django.core.exceptions.ImproperlyConfigured: The model Attendance has a composite primary key, so it cannot be registered with admin.

Observações:

Segunda a doc:

Ainda estamos trabalhando no suporte a chaves primárias compostas para campos relacionais, incluindo campos GenericForeignKey, e para o Django Admin. No momento, modelos com chaves primárias compostas não podem ser registrados no Django Admin. Você pode esperar esse recurso em versões futuras.

Veja mais em:

  • apps/school/

Veja aqui a chave composta via DBeaver.

Observações: O Django não oferece suporte para migração para, ou a partir de, uma chave primária composta após a criação da tabela. Também não é possível adicionar ou remover campos de uma chave primária composta por meio de migrações do Django.

Se você deseja migrar uma tabela existente de uma chave primária única para uma chave primária composta, siga as instruções específicas do seu sistema de banco de dados para realizar essa alteração manualmente.

Depois que a chave primária composta estiver definida no banco de dados, adicione o campo CompositePrimaryKey ao seu modelo. Isso permitirá que o Django reconheça e trate corretamente a chave primária composta.

Minor features

Forms — New Inputs

ColorInput

class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = ('name', 'class_group', 'color')
        widgets = {
            'color': forms.ColorInput()
        }

Rodando: localhost:8000/school/create

TelInput

class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = ('name', 'class_group', 'color', 'phone')
        widgets = {
            ...
            'phone': forms.TelInput(),
        }

SearchInput

class SearchForm(forms.Form):
    search = forms.CharField(
        required=False,
        widget=forms.SearchInput()
    )

JSONArray

A nova função de banco de dados JSONArray aceita uma lista de nomes de campos ou expressões e retorna um array JSON contendo esses valores.

Templates

simple_block_tags

O novo decorador simple_block_tag() permite a criação de block tags simples, que podem aceitar e utilizar uma seção do template.

  • Arquivo: card_tags.py

from django import template
from django.utils.html import format_html


register = template.Library()


@register.simple_block_tag(takes_context=True)
def card(context, content, header, footer):
    format_kwargs = {
        "header": header,
        "content": content,
        "footer": footer,
    }
    result = """
    <article>
      <header>{header}</header>
      {content}
      <footer>{footer}</footer>
    </article>
    """
    return format_html(result, **format_kwargs)
  • Template: student_list.html

{\% extends "base.html" %}

{\% load msgbox_tags %}
{\% load card_tags %}

{\% block content %}
  <div class="container">
    <h1>Alunos</h1>

    <div class="grid">
      <a role="button" href="{\% url 'school:student_create' %}">Cadastrar novo aluno</a>

      <form action="" method="GET">
        {{ form.search }}
      </form>
    </div>

    {\% msgbox level="error" %}
      Please fix all errors. Further documentation can be found at
      <a href="http://example.com">Docs</a>.
    {\% endmsgbox %}

    {\% msgbox level="info" %}
      More information at: <a href="http://othersite.com">Other Site</a>/
    {\% endmsgbox %}}

    {\% card header="Cabeçalho" footer="Rodapé" %}
      Este é um exemplo de um card feito com simple_block_tag.

      <figure>
        <img
          src="https://picsum.photos/1800/400"
          alt="picsum photos"
        />
      </figure>
    {\% endcard %}

    <table>
      <tbody>
        {\% for object in object_list %}
          <tr>
            <td>{{ object.pk }}</td>
            <td>{{ object.name }}</td>
            <td>{{ object.class_group }}</td>
            <td>{{ object.color }}</td>
            <td>
              <div class="ball" style="background-color: {{ object.color }}"></div>
            </td>
          </tr>
        {\% endfor %}
      </tbody>
    </table>
  </div>
{\% endblock content %}

{\% block js %}
  <script>
  const input = document.getElementById('id_search');

  input.addEventListener('input', function () {
    if (this.value === '') {
      // Redirect to current URL with no parameters (e.g., ".")
      window.location.href = '.';
    }
  });
</script>
{\% endblock js %

Alterações incompatíveis com versões anteriores na versão 5.2

Não tem mais suporte ao PostgreSQL 13

O suporte oficial ao PostgreSQL 13 será encerrado em novembro de 2025. O Django 5.2 oferece suporte ao PostgreSQL 14 e versões superiores.

Se quiser, você pode desabilitar isso. Leia mais em

O novo permite a criação de tabelas com uma chave primária composta por vários campos.

Diagrama UML (feito no ):

Leia mais em

Você também pode usar o para validar o formato do telefone no models ou no forms.

How to customize the shell command
django.db.models.CompositePrimaryKey
mermaid.live
Rodando a lista de presença no shell
Migrating to a composite primary key
django-phonenumber-field
Documentação
Django 5.2
https://docs.djangoproject.com/en/5.2/releases/5.2/
https://github.com/rg3915/django52
01
02
mermaid_school
ImproperlyConfigured
DBeaver
forms.py
jsonarray
simple_block_tag 06
simple_block_tag 07
simple_block_tag 08
card_tags
student_list.html