Por Luferat em 07/11/2026
O Django já possui um model de usuários pronto, chamado User, que faz parte do sistema de autenticação (django.contrib.auth).
Você pode importar o model padrão assim:
from django.contrib.auth.models import User
Você também pode consultar os campos diretamente pelo próprio Django:
from django.contrib.auth.models import User
for field in User._meta.fields:
print(field.name, field.get_internal_type())
Visualize a tabela auth_user do SQLite para ver a estrutura.
O ORM do Django também permite personalizar consultas com Managers persolnalizados. Usamos isso, por exemplo, para "nunca" mostrar entidades apagadas (is_deleted = True).
Podemos substituir o model padrão do Django User por um model próprio, herdando de AbstractUser. Isso permite adicionar campos e até substituir campos existentes na estrutura original. Por exemplo, o 'User' do Django não tem um campo de imagem (avatar) ou de data de nascimento, por exemplo. Em um "blog", a adição desses campos pode ser algo útil...
Só altere a estrutura dos usuários do Django no começo do projeto, antes de criar as partes lógicas que dependem disso e, preferencialmente, antes das "migrations"!
Essa é uma feature avançada. Crie um branch e siga os passos com muita atenção...
Então vamos criar nosso próprio model User, herdando de AbstractUser. Como estamos começando o projeto, vamos fazer isso agora, antes de avançar com as migrações do banco de dados.
Obtenha a nova versão de blog/models.py, substituindo a atual:
Mantenha Ctrl pressionada ao clicar no link.
Clique no botão Raw para facilicar copiar e colar os códigos.
Observe algumas coisas:
AbstractUser: herdamos toda a estrutura de autenticação do Django.
first_name = None e last_name = None: removemos os campos originais.
name: nosso novo campo para o nome completo.
birth_date: aceita data de nascimento opcional.
image: armazena o caminho da imagem de perfil.
metadata: dados adicionais sobre o usuário. Um "mini currículo" opcional para os autores.
__str__: apresenta o nome do usuário.
Temos ainda duas classes: class UserManager(): e class PostManager():. Esses são nossos "managers" personalizados que alteram o comportamento padrão das consultas durante a operação do aplicativo.
Com esses "managers" teremos:
Situação Post aparece em `Post.objects`?
Post não excluído, autor ativo Sim
Post excluído, autor ativo Não
Post não excluído, autor excluído Não
Post excluído, autor excluído Não
Para trabalhar com as imagens dos usuários, instale a bilbioteca "Pillow", comandando no terminal:
pip install Pillow
Atualize a lista de pacotes com:
pip freeze > requirements.txt
Abra core/settings.py e, no final do arquivo, adicione:
AUTH_USER_MODEL = 'blog.User'
Essa configuração informa ao Django que nosso model de usuários agora é User, localizado no aplicativo blog.
Precisamos "reescrever" o banco de dados, então, siga os passos com atenção:
Pare o servidor do aplicativo se ele está rodando;
Acesse a pasta blog/migrations;
Apague todos os arquivos que iniciam com números;
Apague o arquivo db.sqlite3 que é nosso banco de dados físico;
No terminal, atualize as migrations:
O Django deverá identificar os models "User" e "Post" e gerar arquivos de migração nos respectivos aplicativos...
run makemigrations
Crie o banco de dados:
A estrutura deve ser criada sem erros...
run migrate
Crie o "super usuário":
run createsuperuser
Vamos criar mais alguns usuários "fake" para serem proprietários das postagens.
No terminal, abra o Django Shell:
run shell
Copie os códigos abaixo e cole tudo no terminal:
from blog.models import User
User.objects.create_user(
username='joca',
password='Senha@123',
name='Joca da Silva',
email='jocasilva@email.com',
image='https://randomuser.me/api/portraits/men/76.jpg'
)
User.objects.create_user(
username='marineuza',
password='Senha@123',
name='Marineuza Siriliano',
email='marisiri@email.com',
image='https://randomuser.me/api/portraits/women/40.jpg'
)
Tecle Enter para executar.
Verifique no banco de dados se os usuários foram criados.
Se não ocorreram erros, tecle Ctrl+Z e Enter para sair do Django Shell.
Crie as postagens "fake" com o comando:
run populate
Vamos ajustar os dados do autor na exibição do post completo:
Edite blog\templates\post_detail.html;
Troque o conteúdo por:
{% extends '_base.html' %}
{% load static %}
{% block content %}
<article>
{% if post.thumbnail %}
<div><img src="{{ post.thumbnail }}" alt="{{ post.title }}" class="w-100 rounded"></div>
{% endif %}
<h2 class="my-4">{{ post.title }}</h2>
<div class="alert alert-secondary p-2 text-end">
<small><em>
Por {{ post.user.name|default:post.user.username }}
em {{ post.created_at|date:"d/m/Y \à\s H:i" }}.
</em></small>
</div>
<div>{{ post.textbody|safe }}</div>
</article>
{% endblock %}
{% block aside %}
{# Imagem padrão caso o usuário não tenha imagem. #}
{% static 'img/anonimous.jpg' as default_image %}
<aside>
<h5>{{ post.user.name|default:post.user.username }}</h5>
<img src="{{ post.user.image|default:default_image }}" alt="{{ post.user.name }}" class="img-fluid rounded mx-auto d-block mt-2">
<small class="d-block text-center mt-2">Membro desde {{ post.user.date_joined|date:"d/m/Y" }}</small>
</aside>
{% endblock %}
Salve a imagem abaixo como blog\static\img\anonimous.jpg:
Você pode trocar a imagem do usuário anônimo por outra. Lembre-se apenas de, se necessário, ajustar:
{% static 'img/anonimous.jpg' as default_image %}
Rode o servidor do aplicativo (run), verifique se as postagens funcionam e faça todos os testes...