Django Brasil


Documentação em português


Escrevendo sua primeira aplicação Django, parte 2

Este tutorial inicia-se onde o Tutorial 1 terminou. Vamos continuar a aplicação web de enquete e focaremos no site de administração automática do Django.

Filosofia

Gerar site de administração para sua equipe ou clientes adicionarem, editarem ou excluírem conteúdo é um trabalho entediante que não requer muita criatividade. Por esta razão, o Django automatiza toda a criação da interface de administração para os modelos.

Django foi escrito em um ambiente de newsroom, com uma clara separação entre "produtores de conteúdo" e o site "público". Gerentes de site usam o sistema para adicionar notícias, eventos, resultado de esportes, etc., e o conteúdo é exibido no site público. O Django soluciona o problema de criar uma interface unificada aos administradores para editar o conteúdo.

A administração não foi desenvolvida necessariamente para ser usada pelos visitantes do site e sim para os gerentes.

Ative o site de admin

O site de administração não está ativo por padrão -- isto é algo opcional. Para ativar o site de administração para sua instalação, siga esses três passos:

  • Adicione "django.contrib.admin" às suas configurações de "INSTALLED_APPS".
  • Execute python manage.py syncdb. Pois uma nova aplicação foi adicionada ao INSTALLED_APPS, e as tabelas do banco de dados precisam ser atualizadas.
  • Edite seu arquivo meusite/urls.py e tire o comentário da linha abaixo de "Uncomment this for admin:". Este arquivo é um URLconf; entraremos em detalhes sobre o URLconfs no próximo tutorial. Por enquanto, tudo o que você tem a fazer é mapear as URL principais para as aplicações.

Iniciando o servidor de desenvolvimento

Vamos iniciar o servidor de desenvolvimento e explorar o site admin.

Lembre-se do Tutorial 1 onde você iniciou o servidor com:

python manage.py runserver

Agora, abra o navegador de internet e vá para "/admin/" no seu domínio local -- por exemplo, http://127.0.0.1:8000/admin/. Você deverá ver a tela de login:

Django admin login screen

Entre no site de administração

Agora, tente acessar o sistema. (Você criou uma conta de superusuário na primeira parte deste tutorial, lembra-se?). Você deverá ver a página inicial do Django admin:

Django admin index page

Você deverá ver alguns outros tipos de conteúdo editável, incluindo grupos, usuários e sites. Estes são as funcionalidades centrais que o Django inclui por padrão.

Torne a aplicação de enquetes editável no site admin

Mas onde está nossa aplicação de enquete? Ela não está visível na página principal do admin.

Somente uma coisa: nós temos que especificar no modelo "Enquete" que os objetos "Enquete" têm uma interface de administração. Edite o arquivo "meusite/enquete/models.py" e faça a seguinte alteração para adicionar uma classe interna Admin:

class Poll(models.Model):
    # ...
    class Admin:
        pass

A class Admin irá conter todas as configurações que controlam como este modelo aparece no Django admin. Todas as configurações são opcionais, entretanto, criar uma classe vazia significa "dar ao objeto uma interface de administração usando todas as opções padrão".

Agora atualize a página do Django admin para ver suas alterações. Note que você não tem que reiniciar o servidor de desenvolvimento -- o servidor reiniciará seu projeto, e todas as modificações no código serão vistas imediatamente no seu navegador.

Explore a funcionalidade de administração gratuita

Agora que a Enquete tem uma classe interna Admin, o Django sabe que ela deve ser exibida na página principal do admin:

Página principal de administração, agora com a Enquete exibida

Clique em "Enquetes". Agora você está na página "lista de alteração" para as enquetes. Esta página exibe todas as enquetes no banco de dados e permite ao usuário alterá-las.

Existe a enquete "What's up?" criada no primeiro tutorial:

Lista para alterações de enquetes

Clique na enquete "What's up?" para editá-la:

Formulário de edição para a enquete

Note o seguinte:

  • O formulário é gerado automaticamente a partir do modelo Enquete.
  • Os diferentes tipos de modelo (models.DateTimeField, models.CharField) correspondem ao widget de inserção HTML apropriado. Cada tipo de campo sabe como exibir a si mesmo no Django admin.
  • Cada DateTimeField tem um atalho JavaScript gratuito. As datas tem um atalho "Hoje" e um calendário popup, e as horas têm um atalho "Agora" e um popup conveniente com listas de horas comumente usadas.

A parte inferior da página fornece uma série de opções:

  • Save -- Salva as alterações e retorna à lista para edição deste tipo de objeto.
  • Save and continue editing -- Salva as alterações e retorna à página deste objeto.
  • Save and add another -- Salva as informações e abre um formulário em branco deste tipo de objeto.
  • Delete -- Exibe uma página de confirmação de exclusão.

Altere a "Publication date" clicando nos atalhos "Today" e "Now". Em seguida, clique em "Save and continue editing." Então clique em "Histórico" no lado superior direito. Você verá uma página exibindo todas as alterações feita a este objeto pelo Django admin, com a hora e o nome de usuário da pessoa que fez a alteração:

Página de histórico para o objeto Enquete.

Personalize o formulário de Administração

Tire alguns minutos para apreciar todo o código que você não teve que escrever.

vamos personalizá-lo um pouco. Podemos reordenar os campos adicionando o parâmetro fields ao Admin:

class Admin:
    fields = (
        (None, {'fields': ('pub_date', 'question')}),
    )

Isto faz com que o "Publication date" seja mostrado por primeiro e não em segundo:

Os campos foram reordenados

Isto não é impressionante com apenas dois campos, mas para formulários com dúzias de campos, escolhendo uma ordem intuitiva é um detalhe importante para a usabilidade.

E falando em formulários com dúzias de campos, você pode querer dividir o formulário em grupos:

class Admin:
    fields = (
        (None, {'fields': ('question',)}),
        ('Date information', {'fields': ('pub_date',)}),
    )

O primeiro elemento de cada tupla em fields é o título do grupo. Aqui está a aparência do formulário agora:

Formulário têm grupos de campos agora

Você pode atribuir classes HTML arbitrárias para cada grupo. O Django provê uma classe "collapse" que exibe um grupo particular inicialmente recolhido. Isto é útil quando você tem um formulário longo que contêm um grupo de campos que não são comumente utilizados:

class Admin:
    fields = (
        (None, {'fields': ('question',)}),
        ('Date information', {'fields': ('pub_date',), 'classes': 'collapse'}),
    )
Grupo de campos (fieldset) inicialmente recolhido

Adicionando objetos relacionados

Ok, temos nossa página de administração de Enquetes. Mas uma Poll (enquete) tem múltiplos Choices (opções), e a página de administração não exibe as opções.

Ainda.

Há duas formas de solucionar este problema. A primeira é dar ao modelo Choice sua própria classe Admin interna, assim como fizemos com Poll. Aqui está como isso ficaria:

class Choice(models.Model):
    # ...
    class Admin:
        pass

Agora "Choices" é uma opção disponível no Django admin. O formulário de "Add choice" se parece com isto:

Página de admin para Choice

Neste form, o campo "Poll" é uma caixa de seleção contendo todas as enquetes no banco de dados. O Django sabe que uma ForeignKey deve ser representada no admin como um campo <select>. No nosso caso, somente uma enquete existe até agora.

Note também o link "Add Another" (Adicionar nova) ao lado de "Poll". Todo objeto com um relacionamento de chave extrangeira para outro ganha esta ação gratuitamente. Quando você clica em "Add Another", você terá uma janela popup com o formulário "Add poll". Se você adicionar uma enquete na janela e clicar em "Save", o Django salvará a enquete no banco de dados e dinamicamente irá adicionar à opção já selecionada no formulário "Add choice" que você está vendo.

Mas, sério, isto é uma forma ineficiente de adicionar objetos Choice ao sistema. Isso seria muito melhor se você pudesse adicionar várias opções diretamente quando você cria um objeto Poll (enquete). Vamos fazer isso acontecer.

Remova o Admin do modelo Choice. então, edite o campo ForeignKey(Poll) como a seguir:

poll = models.ForeignKey(Poll, edit_inline=models.STACKED, num_in_admin=3)

Isso informa ao Django: "Objetos Choice são editados na mesma página de administração de Poll. Por padrão, forneça campos suficientes para 3 Choices."

Então altere outros campos em Choice para incluir core=True:

choice = models.CharField(max_length=200, core=True)
votes = models.IntegerField(core=True)

Isto informa ao Django: "Quando você edita uma opção na página de admin de Poll, os campos 'choice' e 'votes' são requeridos. A presença de pelo menos um deles significa a adição de um novo objeto Choice, e limpando qualquer dos dois significa a exclusão de um objeto Choice existente".

Carregue a página "Add poll" para ver como está:

Página Add Poll contém Choices agora

Isto funciona da seguinte forma: Há três blocos para Choices relacionados -- como especificado em num_in_admin -- mas cada vez que você retorna à página de "Alteração" para um objeto já criado, você consegue um novo bloco. (Isto significa que não há limite que possa ser especificado para quantos objetos relacionados podem ser adicionados). Se você quiser espaços para três opções cada vez que você altera a enquete, você deve usar num_extra_on_change=3.

Entretanto, há um pequeno problema. Isso toma um monte de espaço na tela para exibir todos os três objetos Choice relacionados a serem inseridos. Por esta razão, o Django oferece uma maneira alternativa para exibir cada objeto relacionado em uma única linha.:

poll = models.ForeignKey(Poll, edit_inline=models.TABULAR, num_in_admin=3)

com o edit_inline=models.TABULAR (ao invés de models.STACKED), os objetos relacionados são exibidos de uma maneira mais compacta que o formato de tabela:

A página Add poll agora com opções compactas

Customizando a página de lista de edição

Agora que a página de administração de Enquetes está bonita, vamos fazer algumas melhorias à página "change list" (lista de edição) -- aquela que exibe todas as enquetes do sistema.

Aqui como ela está até agora:

Página de lista de Enquetes

Por padrão, o Django mostra o str() de cada objeto. Mas algumas vezes seria mais útil se pudéssemos mostrar campos individuais. Para fazer isso, use a opção list_display, que é uma tupla de nomes de campos a serem exibidos, como colunas, na página de lista de edição dos objetos:

class Poll(models.Model):
    # ...
    class Admin:
        # ...
        list_display = ('question', 'pub_date')

Apenas para facilitar, vamos incluir o método customizado was_published_today do Tutorial 1:

list_display = ('question', 'pub_date', 'was_published_today')

Agora a página de edição de enquetes está assim:

Página de edição de enquetes, atualizada

Você pode clicar no cabeçalho da coluna para ordená-las por estes valores -- exceto no caso do was_published_today, porque a ordenação pelo resultado de um método arbitrário não é suportada. Também note que o cabeçalho da coluna para was_published_today é, por padrão, o nome do método (com underscores substituídos por espaços). Mas você pode alterar isso fornecendo ao método um atributo short_description:

def was_published_today(self):
    return self.pub_date.date() == datetime.date.today()
was_published_today.short_description = 'Published today?'

Vamos adicionar uma outra melhoria à página de lista de edição: Filtros. Adicione a seguinte linha ao Poll.Admin:

list_filter = ['pub_date']

Isto adiciona uma barra lateral de "Filtro" que permite às pessoas filtrarem a lista de edição pelo campo pub_date:

Página de edição de enquetes, atualizada

O tipo de filtro exibido depende do tipo de campo que você está filtrando. Devido ao pub_date ser um DateTimeField, o Django sabe dar as opções de filtro para DateTimeFields: "Qualquer data," "Hoje,"Últimos 7 dias," "Este mês," "Este ano."

Isto está tomando uma boa forma. Vamos adicionar alguma capacidade de pesquisa:

search_fields = ['question']

Isto adiciona um campo de pesquisa no topo da lista de edição. Quando alguém informa termos de pesquisa, o Django irá pesquisa o campo question. Você pode usar quantos campos quiser -- entretanto porque ele usa um comando LIKE internamente, seja moderado, para manter seu banco de dados feliz.

Finalmente, porque os objetos Enquete têm datas, é conveniente acompanhar por data. Adicione esta linha:

date_hierarchy = 'pub_date'

Isto adiciona uma navegação hierárquica, por data, no topo da página lista de edição. No nível mais acima, ele exibe todos os anos disponíveis. Então desce para os meses e, por último, os dias.

Agora é também uma boa hora para notar que a lista de edição fornece uma paginação gratuitamente. O padrão é mostrar 50 ítens por página. A página da lista de edição, campos de pesquisa, filtros, hierarquia por data, ordenação por cabeçalho de coluna, todos trabalham em sincronia como deveriam.

Customize o look and feel do admin

Óbviamente, ter "Django administration" no topo de cada página de admin é ridículo. Isto é só um texto de exemplo.

É fácil de editar, entretanto, usando o sistema de template do Django. O Django admin é feito com o próprio Django, e sua interface usa o próprio sistema de templates do Django.

Abra seu arquivo de settings (mysite/settings.py, lembre-se) e veja a configuração TEMPLATE_DIRS. TEMPLATE_DIRS é uma tupla de diretórios de arquivo que serão verificados quando carregar os templates do Django. Isto é, são search path.

Por padrão, TEMPLATE_DIRS é vazio. Portanto, vamos adicionar uma linha a isso, para dizer onde nossos templates Django estão:

TEMPLATE_DIRS = (
    "/home/my_username/mytemplates", # Change this to your own directory.
)

Agora copie o template admin/base_site.html de dentro do diretório padrão do Django admin (django/contrib/admin/templates{) em um subdiretório admin onde quer que esteja o diretório que você está usando em TEMPLATE_DIRS. Por exemplo, se seu TEMPLATE_DIRS inclue "/home/my_username/nytemplates", como acima, então copie django/contrib/admin/templates/admin/base_site.html para /home/my_username/mytemplates/admin/base_site.html. Não esqueça do subdiretório admin.

Então, somente edite o arquivo e substitua o texto genérico do Django com o nome do seu próprio site como desejar.

Note que qualquer template padrão do admin podem ser sobrescritos. Para sobrescrever um template, apenas faça a mesma coisa que você fez com base_site.html -- copie ele do diretório padrão para o seu próprio diretório, e faça as mudanças.

Leitores astutos irão se perguntar: Mas se TEMPLATE_DIRS estava vazio por padrão, como o Django pode encontrar o diretório padrão dos templates do admin? A resposta é, por padrão, o Django irá automaticamente procurar por um subdiretório templates/ dentro de cada pacote de aplicação, para usar como fallback. Veja a documentação de loader types - para a informação completa

Customizar a página inicial do admin

De maneira similar, você pode querer customizar o look and feel da página inicial do Django admin.

Por padrão, isto exibe todas as aplicações disponíveis, de acordo com sua configuração INSTALLED_APPS. Mas a ordem em que serão exibidas é aleatória, e você pode querer fazer alterações significativas no layout. Além do que, a página inicial é provavelmente a página mais importante no admin, e deve ser fácil de usar.

O template a ser customizado é o admin/index.html. (Faça o mesmo com que com o admin/base_site.html``na seção anterior -- copie ele do diretório padrão para o seu próprio diretório de template.) Edite o arquivo, e você verá que ele usa uma template tag chamada ``{% get_admin_app_list as app_list %}. Esta é a mágica que obtém toda aplicação instalada no Django. Ao invés de usar ela, você pode explicitamente fazer os links para os objetos específicos na página de admin, na maneira que achar mais apropriado. best.

O Django oferece um atalho neste departamente. Rode o comando python manage.py adminindex polls para pegar o trecho do código para a inclusão no template da página inicial do amin. Ele é um ótimo ponto de partida.

Para um detalhamento completo na customização do look and feel do site de Dajngo admin em geral, veja o Guia de CSS do Django admin.

Quando você se sentir confortável com o site de admin, leia a parte 3 deste tutorial para começar a trabalhar com as views públicas da enquete.



Hospedado por PyTown.com. Django Brasil é a comunidade brasileira de usuários do framework web Django. Django é uma marca registrada de Lawrence Journal-World.