Trechos traduzidos do manual do Django

Parte II

Django Admin

Uma das partes mais poderosas do Django é a Interface Automática de Administração (admin). Ela lê os metadados do seu model e provê uma poderosa interface para começar a adicionar conteúdo ao site.

Visão geral

Há cinco etapas na ativação do Django admin:

1. Adicionar django.contrib.admin na variável INSTALLED_APPS no arquivo settings.py
2. Determinar quais models da sua aplicação devem ser editáveis na interface admin.
3. Para cada um desses models, é possível criar uma classe ModelAdmin que encapsula e personaliza as funcionalidades do admin.
4. Instanciar uma classe AdminSite e relacionar seus models ao ModelAdmin.
5. Criar uma instância do AdminSite na URLconf, no arquivo urls.py

Objetos do ModelAdmin

As classes ModelAdmin são representações de um model na interface admin. São armazenadas em um arquivo chamado admin.py. Agora, vamos dar uma olhada em um exemplo muito simples da ModelAdmin:

from django.contrib import admin
from myproject.myapp.models import Author
 
class AuthorAdmin(admin.ModelAdmin):
  pass
admin.site.register(Author,AuthorAdmin)

Será que você precisa de um objeto ModelAdmin em tudo?

No exemplo anterior, a classe ModelAdmin não define quaisquer valores personalizados (ainda). Sendo assim, a interface padrão do admin será exibida. Se você estiver satisfeito com a interface padrão do admin, não precisa definir um objeto ModelAdmin. Pode apenas registrar a classe model sem fornecer uma descrição ModelAdmin. O exemplo anterior poderia ser simplificado para:

from django.contrib import admin
from myproject.myapp.models import Author
 
admin.site.register(Author)

Opções do ModelAdmin

O ModelAdmin é muito flexível. Tem várias opções para lidar com a personalização da interface. Todas as opções são definidas como uma subclasse do ModelAdmin:

class AuthorAdmin(admin.ModelAdmin):
  ...
 
date_hierarchy

Ao atribuir para date_hierarchy o nome de um DateField ou DateTimeField do seu model, será incluída uma lista para uma navegação detalhada por esse campo.

Exemplo:

date_hierarchy = 'data_cadastro'

form

Por padrão, uma ModelForm é criada dinamicamente para o seu model. É utilizado para criar o formulário que exibirá as páginas de adicionar/ modificar dados. Você pode facilmente fornecer seu próprio ModelForm para substituir qualquer comportamento padrão sobre a forma adicionar/ modificar páginas.
Para ver um exemplo, vá para seção Adicionando Validação Personalizada para o admin.

fieldsets

Usado para controlar o layout das páginas “adicionar” e “modificar”.
Um fieldset é um array de dois valores, em que cada representa um elemento html fieldset.
Os dois valores estão no formato (name, field_options), onde name é uma string representando o título do fieldset e field_options é um dicionário de informações sobre o fieldset, incluindo uma lista de campos a serem exibidos no mesma.

Um exemplo completo, a partir da model django.contrib.flatpages.FlatPage:

class FlatPageAdmin(admin.ModelAdmin):
  fieldsets = (
      (None , {
          'fields' : ( 'url' , 'titulo' , 'conteudo' , 'sites' )
       }),
       ( 'Advanced options' , {
           'classes': ( 'collapse', ),
           'fields': ('enable_comments','registration_required','template_name')
       })
  )

Se não for configurado a propriedade fieldsets, o Django irá exibir por padrão cada campo que seja editável (editable=True) e que não seja de auto incremento (AutoField=True), em um único fieldset, na mesma ordem que os campos foram definidos no model.

O dicionário field_options pode ter as seguintes chaves:

fields

Um array contendo o nome dos campos que serão exibidos neste fieldset. Esta chave é obrigatória.
Exemplo:

{
  'fields' : ( 'nome' , 'sobrenome' , 'endereco' , 'cidade' , 'UF' ),
}

Para exibir vários campos na mesma linha, junte os campos em seus próprios arrays. Neste exemplo, o os campos nome e sobrenome serão exibidos na mesma linha:

{
  'fields': (( 'nome','sobrenome' ),'endereco','cidade','UF' ),
}

classes

Uma lista extra contendo classes CSS para aplicar ao fieldset.
Exemplo:

{
  'classes' : [ 'wide' , 'extrapretty' ],
}

Duas classes úteis definidas pela folha de estilo (stylesheet) padrão do admin são collapse e wide. Fieldsets com estilo collapse serão inicializados reduzidos contendo um botão “clique para expandir”, e com wide ganharão um espaço horizontal extra.

description

Uma string com um texto opcional a ser apresentado no início de cada fieldset, abaixo do título.
Nesse texto os caracteres especiais não são escapados. Utilize django.utils.html.escape() para escapar.

fields

Utilize esta opção como uma alternativa para fieldsets se o layout não o agradar ou se quiser exibir somente um subconjunto dos campos disponíveis no formulário. Por exemplo, você poderia definir uma versão mais simples do form admin com django.contrib.flatpages.FlatPage:

class FlatPageAdmin(admin.ModelAdmin):
  fields = ('url','titulo','conteudo')

No exemplo acima, apenas os campos “url”, “titulo” e “conteúdo” serão exibidos, seqüencialmente, no form.

Nota :
A opção fields não deve ser confundida com o array de campos usado como chave dentro dos fieldsets, tal como descrito na seção anterior.

exclude

Este atributo, se for informado, deve ser uma lista de nomes de campos que não apareceram no form.
Por exemplo, vamos considerar o seguinte model:

class Autor(models.Model):
  nome = models.CharField(max_length=100)
  titulo = models.CharField(max_length=3)
  data_nascimento = models.DateField(blank=True,null=True)

Se você deseja um form que mostre apenas os campos nome e titulo, deve proceder dessa forma:

class AutorAdmin(admin.ModelAdmin):
  fields = ('nome','titulo')
 
class AutorAdmin(admin.ModelAdmin):
  exclude = ('data_nascimento',)

filter_horizontal

Cria um campo personalizado usando javascript ao invés do elemento select no form. The value is a list of fields that should be displayed as a horizontal filter interface. O valor é uma lista de campos que serão exibidos de forma horizontal.

filter_vertical

A mesma coisa que filter_horizontal, mas na forma vertical.

list_display

Utilizado para controlar os campos que são exibidos na página do admin.

Exemplo:

list_display = ('nome','sobrenome')

Se list_display não for utilizada, o admin exibirá uma coluna única com o resultado do método __unicode__() representado em cada objeto.

Há quatro possíveis valores que podem ser utilizados em list_display:

1. Um campo do model. Por exemplo:

class PessoaAdmin(admin.ModelAdmin):
  list_display = ('nome','sobrenome')

2. Uma chamada que aceita como parâmetro um objeto. Por exemplo:

def upper_case_name(obj):
  return "%s %s" % (obj.nome,obj.sobrenome).upper()
upper_case_name.short_description = 'Nome'
 
class PessoaAdmin(admin.ModelAdmin):
  list_display = (upper_case_name,)

3. Uma string representando um atributo do ModelAdmin. Este é o mesmo método chamado. Por exemplo:

class PessoaAdmin (admin.ModelAdmin):
  list_display = ('upper_case_name',)
 
def upper_case_name(self,obj):
  return "%s %s" % (obj.nome,obj.sobrenome).upper()
upper_case_name.short_description = 'Nome'

4. Uma string representando um atributo do model. Exemplo:

class Pessoa(models.Model):
  nome = models.CharField(max_length=50)
  data_nascimento = models.DateField ()
 
  def decada_nasc(self):
    return self.data_nascimento.strftime('%Y')[: 3 ] + "0's"
  decada_nasc.short_description = 'Década da data do nascimento'
 
class PersonAdmin(admin.ModelAdmin):
  list_display = ('nome','decada_nasc')

A alguns casos especiais sobre list_display:

Se o campo for um ForeignKey, Django irá exibir o resultado de __unicode__ () do objeto relacionado.
Campos ManyToManyField não são suportados, porque isso implicaria a execução de uma instrução SQL separada para cada linha na tabela. No entanto, se ainda assim quiser utilizar, é necessário criar um método personalizado contendo o list_display.
Se o campo for um BooleanField ou NullBooleanField, será exibido um ícone de “on” ou “off” ao invés de True ou False.
Se a string fornecida for um método do model, ModelAdmin ou uma função, o Django irá escapar os caracteres HTML. É possível definir quais tags HTML não serão escapadas definindo o valor do atributo allow_tags para True. Exemplo:

class Person(models.Model):
  nome = models.CharField(max_length=50)
  sobrenome = models.CharField(max_length=50)
  cor = models.CharField(max_length=6)
 
  def colorir_nome(self):
    return '<span style="color: #%s;">%s </span>' % (self.cor, self.nome)
  colorir_nome.allow_tags = True
 
class PessoaAdmin(admin.ModelAdmin):
  list_display = ('nome', 'sobrenome', 'cor')

Se a string fornecida for um método do model, ModelAdmin ou uma função e retornar um valor Verdadeiro ou Falso,o Django exibirá um ícone de “on” ou “off” se for definido um atributo com o mesmo nome do método e tiver um valor True.

class Person(models.Model):
  nome = models.CharField(max_length=50)
  data_nascimento = models.DateField()
 
  def nasceu_anos_50(self):
    return self.data_nascimento.strftime('%Y')[:3] == 5
  nasceu_anos_50.boolean = True
 
class PessoaAdmin(admin.ModelAdmin):
  list_display = ('nome', 'nasceu_anos_50')

Os métodos __str__() e __unicode__() são válidos apenas dentro de um list_display ou qualquer outro método de um model, logo é perfeitamente possível o código abaixo:

list_display = ('__unicode__', 'outro_campo_qualquer')

Normalmente, os elementos de um list_display não são campos reais de uma tabela em um banco de dados e não podem ser usados para ordenação de dados. No entanto, se um elemento do list_display representa um determinado campo na tabela, é possível defini-lo como um campo de ordenação utilizando o atributo admin_order_field. Exemplo:

class Person(models.Model):
  nome = models.CharField(max_length=50)
  cor = models.CharField(max_length=6)
 
  def colorir_nome(self):
      return '<span style="color: #%s;">%s</span>' % (self.cor,self.nome)
  colorir_nome.allow_tags = True
  colorir_nome.admin_order_field = 'nome'
 
class PessoaAdmin(admin.ModelAdmin):
  list_display = ('nome', ' colorir_nome')

list_display_links

Utilizado para controlar quais campos definidos no list_display serão linkados à página de “mudanças” do objeto. Por padrão, a página de mudanças terá um link para a primeira coluna – o primeiro campo especificado no list_display. Se for usar list_display_links é necessário definir list_display. Exemplo:

class PessoaAdmin(admin.ModelAdmin):
  list_display = ('nome', 'sobrenome', 'data_nascimento')
  list_display_links = ('nome', 'sobrenome')

list_filter

Utilizado para ativar os filtros na barra lateral direita da página de mudanças do admin. Um exemplo de como list_display e list_filter funcionam:

class UsuarioAdmin(admin.ModelAdmin):
  list_display = ('usuario', 'email', 'nome', 'sobrenome', 'bloqueado')
  list_filter = ('bloquado', 'is_administrador')

list_per_page

Controla quantos itens serão exibidos por cada página quando houver paginação. O padrão é 100.

list_select_related

Obtem os dados de objetos relacionados. Quando utilizado, armazena a consulta em cache, aumentando assim a performance pois evita re-consultas ao banco de dados. O valor deve ser ou True ou False. O padrão é false.
Se um dos campos definidos em list_display for uma ForeignKey, o Django usará esse procedimento independente se for definido um valor True ou False.

Considerações Finais

Existe uma grupo brasileiro dedicado a tradução completa do manual do django. Até agora esse grupo tem feito um excelente trabalho, que pode ser comprovado no site Django Brasil.

Pages: 1 2 3 4

You can leave a response, or trackback from your own site.

Leave a Reply

Powered by WordPress | Shop the Best Verizon Wireless Deals. | Thanks to Best CD Rates, Credit Cards and Credit card