10 - Django Admin
Introdução
O Django Admin é uma ferramenta robusta e personalizável, que permite gerenciar os dados do banco e configurar o backend da aplicação através de uma interface administrativa. A seguir, estão algumas das principais características de personalização do Django Admin, que tornam a ferramenta ainda mais poderosa para desenvolvedores e administradores:
1. ModelAdmin: Customização de Exibição dos Modelos
Através do ModelAdmin, você pode controlar a forma como cada modelo é exibido no Django Admin. Algumas personalizações incluem:
list_display: Define os campos que serão exibidos na lista de registros do modelo. Por exemplo:
class ContentAdmin(admin.ModelAdmin):
list_display = ('title', 'content_type', 'is_public')
list_filter: Adiciona filtros laterais para facilitar a segmentação dos registros. Exemplo:
list_filter = ('content_type', 'is_public')
search_fields: Permite adicionar um campo de busca para procurar registros específicos. Exemplo:
search_fields = ('title', 'description')
2. Campos de Ordenação
Com a opção ordering, você pode definir a ordem padrão em que os registros serão exibidos.
ordering = ['-updated_at']
3. Campos de Edição Inline
Django Admin permite editar objetos relacionados dentro de um formulário de outro objeto, usando inlines. Por exemplo, se você tem um modelo Comment relacionado a um Content, pode configurar o Comment como inline no ContentAdmin.
class CommentInline(admin.TabularInline):
model = Comment
extra = 1 # Número de campos de comentário exibidos inicialmente
class ContentAdmin(admin.ModelAdmin):
inlines = [CommentInline]
4. Personalização dos Formulários de Edição
Você pode definir quais campos serão exibidos na página de edição, bem como organizá-los em seções:
fields: Define os campos que estarão disponíveis no formulário.
fields = ('title', 'description', 'file_url', 'thumbnail_url')
fieldsets: Agrupa os campos em seções, permitindo adicionar cabeçalhos de seção:
fieldsets = (
('Informações Básicas', {'fields': ('title', 'description')}),
('Detalhes do Arquivo', {'fields': ('file_url', 'thumbnail_url')}),
)
5. Ações Personalizadas
Com o Django Admin, você pode definir ações customizadas para executar operações em lote nos registros selecionados. Por exemplo, uma ação para marcar conteúdos como públicos:
def make_public(modeladmin, request, queryset):
queryset.update(is_public=True)
make_public.short_description = "Marcar conteúdos como públicos"
class ContentAdmin(admin.ModelAdmin):
actions = [make_public]
6. Filtros e Campos de Busca Personalizados
Além dos filtros de lista, você pode criar filtros personalizados para necessidades específicas e adicionar campos de busca dinâmicos.
- Filtros Personalizados: Use o
SimpleListFilterpara definir filtros avançados.
from django.contrib.admin import SimpleListFilter
class PublicContentFilter(SimpleListFilter):
title = 'public'
parameter_name = 'is_public'
def lookups(self, request, model_admin):
return [('yes', 'Public'), ('no', 'Private')]
def queryset(self, request, queryset):
if self.value() == 'yes':
return queryset.filter(is_public=True)
if self.value() == 'no':
return queryset.filter(is_public=False)
class ContentAdmin(admin.ModelAdmin):
list_filter = (PublicContentFilter,)
7. Edição em Lote
A edição em lote facilita a atualização rápida de registros selecionados ao permitir que se aplique ações de uma só vez.
8. Customização de Templates e CSS
O Django permite que você substitua os templates do admin ou altere o CSS para refletir um estilo específico, modificando o visual da interface administrativa.
Exemplo Completo
from django.contrib import admin
from .models import Content, Comment
class CommentInline(admin.TabularInline):
model = Comment
extra = 1
class ContentAdmin(admin.ModelAdmin):
list_display = ('title', 'content_type', 'is_public')
list_filter = ('content_type', 'is_public')
search_fields = ('title', 'description')
ordering = ['-updated_at']
inlines = [CommentInline]
actions = [make_public]
fieldsets = (
('Informações Básicas', {'fields': ('title', 'description')}),
('Detalhes do Arquivo', {'fields': ('file_url', 'thumbnail_url')}),
)
admin.site.register(Content, ContentAdmin)
Com essas configurações, o Django Admin se torna uma interface poderosa para a administração do seu app de streaming, com filtros, personalizações e uma aparência adaptada ao fluxo de trabalho. Isso otimiza o gerenciamento de conteúdo, facilitando a navegação e a organização dos registros.
9. Permissões e Controle de Acesso
O Django Admin permite definir permissões específicas por modelo e campo, como:
- Permissões por modelo: No
ModelAdmin, você pode restringir quem pode visualizar, adicionar, editar ou excluir registros. - Controle de campos específicos: Restringe quem pode ver ou editar campos específicos. Isso é feito criando métodos como
has_change_permission.
🧩 Modelo Content (exemplo base)
# models.py
from django.db import models
from django.contrib.auth.models import User
class Content(models.Model):
CONTENT_TYPE_CHOICES = (
('audio', 'Áudio'),
('video', 'Vídeo'),
)
title = models.CharField(max_length=255)
description = models.TextField()
file_url = models.URLField()
thumbnail_url = models.URLField()
content_type = models.CharField(max_length=10, choices=CONTENT_TYPE_CHOICES)
created_at = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
🛠️ Admin personalizado
# admin.py
from django.contrib import admin
from .models import Content
@admin.register(Content)
class ContentAdmin(admin.ModelAdmin):
list_display = ('title', 'owner', 'content_type', 'created_at')
list_filter = ('content_type', 'created_at')
search_fields = ('title', 'description')
def has_view_permission(self, request, obj=None):
return request.user.has_perm("app.view_content") or request.user.is_superuser
def has_add_permission(self, request):
return request.user.groups.filter(name='Criadores').exists()
def has_change_permission(self, request, obj=None):
if obj and obj.owner != request.user and not request.user.is_superuser:
return False
return True
def has_delete_permission(self, request, obj=None):
return request.user.is_superuser
def get_fields(self, request, obj=None):
fields = ['title', 'description', 'file_url', 'thumbnail_url', 'content_type']
if request.user.is_superuser:
fields.append('owner')
return fields
def get_readonly_fields(self, request, obj=None):
readonly = ['created_at']
if not request.user.is_superuser:
readonly.extend(['owner'])
return readonly
def save_model(self, request, obj, form, change):
if not obj.pk: # Se for criação
obj.owner = request.user
super().save_model(request, obj, form, change)
✅ Regras aplicadas:
- Apenas usuários do grupo "Criadores" podem adicionar.
- Somente o criador do conteúdo ou um superusuário pode editar.
- Apenas superusuários podem excluir conteúdos.
- Campos como
ownerecreated_atsão apenas leitura. - Filtros e buscas estão ativados por
content_type,created_at,title,description.