Por Luferat em 04/11/2026
Já acessamos a interface administrativa do Django, mas ainda não acessamos as postagens do Blog por lá. Vamos ativá-la para o nosso model.
Abra o blog/admin.py e adicione:
from django.contrib import admin
from .models import Post
admin.site.register(Post)
Aproveitamos e deixamos a interface em português:
Edite core/settings.py com cuidado;
Localize:
LANGUAGE_CODE = 'en-us'
Troque por:
LANGUAGE_CODE = 'pt-br'
Se o servidor do aplicativo está rodando, pare-o;
Sempre que alterar alguma coisa na pasta core, reinicie o servidor do aplicativo.
Rode o servidor e acesse http://localhost:8000/admin/;
Faça login com o "super usuário" e a senha criada para este. Você vai ver uma tela parecida com essa:
Agora experimente:
Clique em Adicionar ao lado de Posts;
Preencha os campos;
Observe que só podemos selecionar um usuário existente;
Apesar de ser possível adicionar usuários daqui...
Clique em Salvar;
Adicione mais alguns da mesma forma, se quiser.
Tudo isso sem escrever nenhum SQL ou criar formulários!
O Django gerou essa interface automaticamente a partir do seu model.
Observe que a interface do Django Admin está em português, mas os nomes dos campos da tabela Post ainda são os originais - melhorados, mas, originais.
Se você achar que é realmente necessário traduzir os nomes dos campos, isso se resolve com o argumento verbose_name em cada campo. O Django usa o nome do atributo como rótulo (title → “Title”) e o LANGUAGE_CODE só traduz as strings da própria interface do Django, não as dos seus modelos.
Aqui está o blog/models.py com os rótulos traduzidos:
from django.db import models
from django.conf import settings
from django.utils import timezone
class Post(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='posts',
verbose_name='Autor'
)
title = models.CharField('Título', max_length=127)
summary = models.CharField('Resumo', max_length=255)
created_at = models.DateTimeField('Criado em', default=timezone.now)
thumbnail = models.URLField('Miniatura (URL)')
textbody = models.TextField('Texto do post')
views = models.IntegerField('Visualizações', default=0)
is_active = models.BooleanField('Ativo', default=True)
is_deleted = models.BooleanField('Excluído', default=False)
class Meta:
verbose_name = 'Post'
verbose_name_plural = 'Posts'
def __str__(self):
return self.title
Na maioria dos campos, o verbose_name pode ser passado como primeiro argumento posicional, o que deixa o código mais enxuto. A exceção são ForeignKey, OneToOneField e ManyToManyField, onde o primeiro argumento posicional é o model relacionado. Por isso, no user, usemos o argumento nomeado verbose_name= explicitamente.
A class Meta define o nome do próprio model no singular e no plural. Sem ela, o admin mostraria “Posts” no menu e “Post” nos botões.
Se preferir outro nome, é só ajustar (por exemplo, 'Publicação' e 'Publicações').
Depois de alterar, pare o servidor e rode:
run makemigrations
run migrate
Mudar verbose_name não altera o banco, mas o Django gera uma migração mesmo assim, para manter o estado dos models em sincronia.
Reinice o servidor e teste a interface administrativa...