Criando novas views para o admin
Um bom tempo sem postar nada novo… porém estou de volta com uma dica simples que já usei bastante.
Quem utiliza o Django com certeza adora a app admin que o acompanha, nós desenvolvedores ganhamos de presente uma administração de sites útil para praticamente qualquer site, e diga-se de passagem as administrações são sempre as partes mais chatas quando se produz um site.
Como nem tudo é perfeito, quando é necessário customizar o admin temos diversas opções, porém essa não é a intenção desse post. Quem quiser saber mais detalhes sobre customização do admin pode acessar a documentação do django e essa página da IBM.
O nosso caso é diferente, existem situações em que precisamos criar novas funcionalidades específicas para a administracao (não estão relacionadas a nenhum model), mantendo o layout e as restrições de acesso.
O primeiro passo é criar a view:
from django.shortcuts import render_to_response
from django.template import RequestContext
def minha_view(request):
#executa alguma funcionalidade
return render_to_response('app/minha_view.html',locals(),request_instance=RequestContext(request))
Note que a view acima é igual a qualquer outra que se faz normalmente.
Em seguida definimos uma url para nossa view:
urlpatterns = patterns('',
(r'^admin/admin_view','app.views.minha_view'),
(r'^admin/', include(admin.site.urls)),
)
Eu preciso definir a minha url antes da url do admin, se ela for colocada após o admin a view não é encontrada. Cuidado para não sobrepor nenhuma view já existente do admin.
Agora criamos o template minha_view.html:
{% extends 'admin/base_site.html' %}
{% block content %}
Aqui ficarão os dados da sua view
{% endblock %}
O template acima é muito simples, caso queira fazer algo mais sofisticado (como css, breadcrumbs e forms) sugiro olhar os templates padrões do admin. Eles podem ser encontrados em: %DJANGO_DIR%/contrib/admin/templates/admin.
Pronto, sua view já possui a ‘cara’ do admin. Porém ela pode ser acessada por qualquer usuário, até mesmo os logados.
O passo natural seria usar o decorator login_required para exigir o login, so que por algum motivo desconhecido os redirecionamentos do admin não combinam muito bem com views externas. Nesso caso a solução é transformar a nossa view numa view do admin, para isso editamos o urls.py:
from django.contrib import admin
from app.views import minha_view
urlpatterns = patterns('',
(r'^admin/admin_view',admin.site.admin_view(minha_view),
(r'^admin/', include(admin.site.urls)),
)
Pronto sua view está protegida de acessos anônimos e todos os redirecionamentos funcionam corretamente.
Agora é só criar suas novas funcionalidades embutidas diretamente no admin.
Espero ter ajudado. Até a próxima.








