.. .. META INFORMATION OF TRANSLATION .. .. $TranslationStatus: Done, waiting for revision $ .. $OriginalRevision: 11268 $ .. $TranslationAuthors: Robson Mendonça $ .. .. INFO OF THIS FILE (DO NOT EDIT! UPDATED BY SUBVERSION) .. .. $HeadURL: http://django-l10n-portuguese.googlecode.com/svn/branches/docs-1.0.X/ref/contrib/admin.txt $ .. $LastChangedRevision: 584 $ .. $LastChangedBy: robsonmwoc $ .. $LastChangedDate: 2009-10-06 21:58:04 -0300 (Tue, 06 Oct 2009) $ .. .. _ref-contrib-admin: ====================== O site admin do Django ====================== .. module:: django.contrib.admin :synopsis: O site de administração do Django. .. currentmodule:: django.contrib.admin Uma das mais poderosas partes do Django é a inteface de administração automática. Ela lê os metadados de seu model para fornecer uma inteface poderosa e pronta para produção que produtores de conteúdo podem imediatamente usar para começar a adicionar conteúdos ao site. Neste documento, nós discutimos como ativar, usar e personalizar a interface de administração do Django. .. admonition:: Nota O site admin foi significantemente refatorado desde a versão 0.96. Este documento descreve a versão mais nova do site admin, que permite customizações mais ricas. Se você acompanha o desenvolvimento do Django em si, você pode ter ouvido isso descrito como "newforms-admin." Visão geral =========== Há cinco passos para ativar o site admin do Django: 1. Adicione ``django.contrib.admin`` no seu ``INSTALLED_APPS``. 2. Determine quais models de aplicações devem ser editados pela interface admin. 3. Para cada um destes models, opicionalmente, crie uma classe ``ModelAdmin`` que encapsula as funcionalidades customizadas do admin e opções para este model particular. 4. Instancie um ``AdminSite`` e o informe sobre cada um de seus models e classes ``ModelAdmin``. 5. Ligue a instância ``AdminSite`` ao seu URLconf. .. seealso:: Para informações sobre como servir arquivos de mídia (imagens, JavaScript, e CSS) associado ao admin em produção, veja :ref:`serving-media-files`. Objetos ``ModelAdmin`` ====================== .. class:: ModelAdmin A classe ``ModelAdmin`` é a representação de um model na interface de administração. Este são armazenados num arquivo chamado ``admin.py`` na sua aplicação. Vamos dar uma olhada num exemplo muito simples de ``ModelAdmin``:: from django.contrib import admin from myproject.myapp.models import Author class AuthorAdmin(admin.ModelAdmin): pass admin.site.register(Author, AuthorAdmin) .. admonition:: Você precisa de um objeto ``ModelAdmin`` sempre? No exemplo anterior, a classe ``ModelAdmin`` não define quaisquer valores personalizados (ainda). Como um resultado, a interface admin padrão será fornecida. Se você estiver feliz com a interface admin padrão, você não precisa definir um objeto ``ModelAdmin`` sempre -- você poder registrar a classe model sem fornecer uma descrição do ``ModelAdmin``. O exemplo anterior poderia ser simplicado para:: from django.contrib import admin from myproject.myapp.models import Author admin.site.register(Author) Opções ``ModelAdmin`` --------------------- O ``ModelAdmin`` é muito flexível. Ele tem várias opções para lidar com customização da interface. Todas as opções são definidas na subclasse ``ModelAdmin``:: class AuthorAdmin(admin.ModelAdmin): date_hierarchy = 'pub_date' .. attribute:: ModelAdmin.date_hierarchy Sete o ``date_hierarchy`` com o nome de um ``DateField`` ou ``DateTimeField`` do seu model, e a lista de dados incluirá uma navegação por data, utilizando o campo informado. Exemplo:: date_hierarchy = 'pub_date' .. attribute:: ModelAdmin.form Por padrão um ``ModelForm`` é dinamicamente criado para seu model. Ele é usado para criar o formulário apresentado em ambas as páginas adicionar/editar. Você pode facilmente fornecer seu próprio ``ModelForm`` para sobrescrever qualquer comportamento de formulário nas páginas adicionar/editar. Para um exemplo veja a seção `Adicionando validação personalizada ao admin`_. .. attribute:: ModelAdmin.fieldsets Sete ``fieldsets`` para controlar o layout das páginas "adicionar" e "editar" do admin. ``fieldsets`` é uma lista de tuplas duplas, em que cada tupla dupla representa um ``
`` sobre a página de formulário do admin. (Um ``
`` é uma "seção" do formulário.) As tuplas duplas estão no formato ``(name, field_options)``, onde ``name`` é uma string representando o título do fieldset e ``field_options`` é um dicionário com informações sobre o fieldset, incluíndo uma lista de campos para serem mostrados nele. Um exemplo completo, recebido do model ``django.contrib.flatpages.FlatPage``:: class FlatPageAdmin(admin.ModelAdmin): fieldsets = ( (None, { 'fields': ('url', 'title', 'content', 'sites') }), ('Advanced options', { 'classes': ('collapse',), 'fields': ('enable_comments', 'registration_required', 'template_name') }), ) Isso resulta numa página admin que parece com: .. image:: _images/flatfiles_admin.png Se o ``fieldsets`` não for fornecido, o Django mostrará o padrão de cada campo que não for um ``AutoField`` e tenha um ``editable=True``, em um fieldset único, na mesma ordem em que os campos foram definidos no model. O dicionário ``field_optinos`` pode ter as seguintes chaves: * ``fields`` Uma tupla com nomes de campos que serão mostrados no fieldset. Esta chave é obrigatória. Exemplo:: { 'fields': ('first_name', 'last_name', 'address', 'city', 'state'), } Para mostrar vários campos na mesma linha, envolva-os em suas próprias tuplas. Neste exemplo, os campos ``first_name`` e ``last_name`` serão mostrados na mesma linha:: { 'fields': (('first_name', 'last_name'), 'address', 'city', 'state'), } * ``classes`` Uma lista contendo classes extra de CSS para serem aplicadas ao fieldset. Exemplo:: { 'classes': ['wide', 'extrapretty'], } Duas classes úteis definidas por padrão no site admin são ``collapse`` e ``wide``. Os fieldsets com o estilo ``collapse`` serão inicialmente encolhidos no admin e substituídos por um link "click para expandir". Os fieldsets com o estilo ``wide`` ocuparão um espaço horizontal extra. * ``description`` Uma string de texto opcional extra para ser mostrado no topo de cada fieldset, abaixo do cabeçalho do fieldset. Note que este valor *não* tem o HTML escapado quando é mostrado na interface do admin. Isso permite você incluir HTML se assim desejar. Aleternativamente você poder usar texto plano e ``django.utils.html.escape()`` para escapar quaisquer caracteres especiais de HTML. .. attribute:: ModelAdmin.fields Use esta opção como uma alternativa ao ``fieldsets`` se o layout não importar e se você deseja somente mostrar um sub-conjunto de campos disponíveis no formulário. Por exemplo, você poderia definir uma versão mais simples do formulário do admin para o model ``django.contrib.flatpages.FlatPage`` desta forma:: class FlatPageAdmin(admin.ModelAdmin): fields = ('url', 'title', 'content') No exemplo acima, somente os campos 'url', 'title' e 'content' serão mostrados, sequencialmente, no formulário. .. admonition:: Nota Estas opções ``fields`` não devem ser confundidas com a chave de dicionário ``fields`` que fica dentro da opção ``fieldsets``, como descrito na seção anterior. .. attribute:: ModelAdmin.exclude Este atributo, se fornecido, deve ser uma lista com nomes de campos a se escluir do formulário. Por exemplo, vamos considerar o seguinte model:: class Author(models.Model): name = models.CharField(max_length=100) title = models.CharField(max_length=3) birth_date = models.DateField(blank=True, null=True) Se você deseja um formulário do model ``Author`` que inclui somente os campos ``name`` e ``title``, você poderia especificar ``fields`` ou ``exclude`` desta forma:: class AuthorAdmin(admin.ModelAdmin): fields = ('name', 'title') class AuthorAdmin(admin.ModelAdmin): exclude = ('birth_date',) Assim o model Author somente terá três campos, ``name``, ``title``, e ``birth_date``, os formulários resultantes das declarações acima conterão extamante os mesmos campos. .. attribute:: ModelAdmin.filter_horizontal Use a nifty unobtrusive JavaScript "filter" interface instead of the usability-challenged ``) para campos que são ``ForeignKey`` ou que tem ``choices`` configurado. Se um campo é apresentado no ``radio_fields``, o Django usará uma interface com radio-button ao invés. Assumindo que ``group`` é um ``ForeignKey`` no model ``Person``:: class PersonAdmin(admin.ModelAdmin): radio_fields = {"group": admin.VERTICAL} Você tem a escolha de usar ``HORIZONTAL`` ou ``VERTICAL`` do módulo ``django.contrib.admin``. Não inclua um campo no ``radio_fields`` a menos que seja um ``ForeignKey`` ou tenha ``choices`` setado. .. attribute:: ModelAdmin.raw_id_fields Por padrão, o admin do Django usa um select-box () para campos que são ``ForeignKey``. Algumas vezes você pode não desejar ficar sujeito a um overhead ao selecionar todos as instâncias relacionadas num drop-down. O ``raw_id_fields`` é uma lista de campos que você gostaria de mudar dentro de um widget ``Input`` tanto para ``ForeignKey`` quanto para ``ManuToManyField``:: class BookInline(admin.TabularInline): model = Book raw_id_fields = ("pages",) ``template`` ~~~~~~~~~~~~ O template usado para renderizar o inline na página. ``verbose_name`` ~~~~~~~~~~~~~~~~ Uma sobrescrita para ``verbose_name`` encontrado na classe interna ``Meta`` do model. ``verbose_name_plural`` ~~~~~~~~~~~~~~~~~~~~~~~ Uma sobrescrita para o ``verbose_name_plural`` encontrado na classe interna ``Meta`` do model. Trabalhando com um model com duas ou mais chaves estrangeiras para o mesmo model pai ------------------------------------------------------------------------------------ Algumas vezes é possível haver mais de uma chave estrangeira para o mesmo model. Vejamos esta instância de model:: class Friendship(models.Model): to_person = models.ForeignKey(Person, related_name="friends") from_person = models.ForeignKey(Person, related_name="from_friends") Se você quiser mostrar um inline nas páginas adicionar/editar do admin para ``Person``, você precisa explicitamente definir a chave primária, tendo em vista que ele não consegue definir automáticamente:: class FriendshipInline(admin.TabularInline): model = Friendship fk_name = "to_person" class PersonAdmin(admin.ModelAdmin): inlines = [ FriendshipInline, ] Trabalhando com Models Intermediários Many-to-Many -------------------------------------------------- Por padrão, os widgets do admin para relações muito-para-muitos serão mostrados inlines não importando qual model contém a referência atual para o ``ManyToManyField``. No entanto, quando você especificar um model intermediário usando o argumento ``through`` para um ``ManyToManyField``, o admin não mostrará o widget por padrão. Isso porque cada instância de model intermediário requer mais informações que poderiam ser mostradas num único widget, e o layout requerido por vários widgets irão variar dependendo do model intermediário. No entanto, nós ainda queremos ter a possibilidade de editar estar informações inline. Felizmente, isso é fácil de fazer com admin models inline. Suponhamos que temos os seguintes models:: class Person(models.Model): name = models.CharField(max_length=128) class Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField(Person, through='Membership') class Membership(models.Model): person = models.ForeignKey(Person) group = models.ForeignKey(Group) date_joined = models.DateField() invite_reason = models.CharField(max_length=64) O primeiro passo em mostrar este model intermediário no admin é definir uma classe inline para o model ``Membership``:: class MembershipInline(admin.TabularInline): model = Membership extra = 1 Este exemplo simples usa o valor padrão ``InlineModelAdmin`` para o model ``Membership``, e limita os formulários adicionais para um. Isso poderia ser personalizado usando qualquer uma das opções disponíveis para classes ``InlineModelAdmin``. Agora crie visões no admin para os models ``Person`` e ``Group``:: class PersonAdmin(admin.ModelAdmin): inlines = (MembershipInline,) class GroupAdmin(admin.ModelAdmin): inlines = (MembershipInline,) Finalmente, registre seus models ``Person`` e ``Group`` no site admin:: admin.site.register(Person, PersonAdmin) admin.site.register(Group, GroupAdmin) Agora seu site admin está configurado para editar objetos ``Membership`` tanto da página de detalhes do ``Person`` quanto do ``Group``. Usando relações genéricas como um inline ---------------------------------------- É possível usar um inline com objetos relacionados genericamente. Vamos dizer que você tenha os seguintes models:: class Image(models.Model): image = models.ImageField(upload_to="images") content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey("content_type", "object_id") class Product(models.Model): name = models.CharField(max_length=100) Se você quer permitir a edição e criação de instâncias ``Image`` sobre ``Product`` você pode simplesmente usar ``GenericInlineModelAdmin`` fornecido pelo ``django.contrib.contenttypes.generic``. No seu ``admin.py`` para esta aplicação de exemplo:: from django.contrib import admin from django.contrib.contenttypes import generic from myproject.myapp.models import Image, Product class ImageInline(generic.GenericTabularInline): model = Image class ProductAdmin(admin.ModelAdmin): inlines = [ ImageInline, ] admin.site.register(Product, ProductAdmin) O ``django.contrib.contenttypes.generic`` fornece ambos um ``GenericTabularInline`` e ``GenericStackedInline`` e se comporta como qualquer outro inline. Veja a :ref:`documentação do contenttypes ` para informações mais específicas. Sobrescrevendo Templates do Admin ================================= É relativamente fácil sobrescrever a maior parte dos templates que o módulo de admin usa para gerar as várias páginas de um site admin. Você pode sobrescrever somente algumas partes desses templates para uma app específica, ou um model específico. Configurando os diretórios de template do admin do seu projeto -------------------------------------------------------------- Os arquivos de template do admin estão localizados no diretório ``contrib/admin/templates/admin``. A fim de sobrescrever um ou mais deles, primeiro crie um diretório ``admin`` no diretórios de templates do seu projeto. Este pode ser qualquer um dos diretórios que você especificou no ``TEMPLATE_DIRS``. Dentro deste diretório ``admin``, crie sub-diretórios com o nome de suas apps. Dentro destes sub-diretórios crie sub-diretórios com o nome de seus models. Perceba, que a aplicação admin procura por nomes de diretórios em minúsculo, então esteja certo do nome deles está todo em minúsculo, caso você esteja rodando sua aplicação num sistemas de arquivo case-sensitive. Para sobrescrever um template do admin para uma app específica, copie e edite o template do diretório ``django/contrib/admin/templates/admin``, e salve-o num dos diretórios criados a pouco. Por exemplo, se nós procurarmos adicionar uma ferramenta na visão de listagem para todos os models de uma aplicação chamada ``my_app``, nós copiariámos ``contrib/admin/templates/admin/change_list.html`` para o diretório ``templates/admin/my_app/`` de seu projeto, e fariámos as mudanças necessárias. Caso desejássemos adicionar uma ferramenta na visão de listagem somente para um model específico chamado 'Page', nós poderiámos copiar aquele mesmo arquivo para o diretório ``templates/admin/my_app/page`` de seu projeto. Sobrescrever vs. substituir um template do admin ------------------------------------------------ Por causa do design modular dos templates do admin, geralmente é necessário, mas nem sempre aconselhável, substituir todo um template. É quase semper melhor sobrescrever somente a seção do template que precisa ser mudada. Para continuar o exemplo acima, nós queremos adicionar um novo link próximo ao ``History`` para o model ``Page``. Depois de olhar no ``change_form.html`` nós determinamos que somente precisamos sobrescrever o bloco ``object-tools``. Assim, aqui está o novo ``change_form.html`` : .. code-block:: html+django {% extends "admin/change_form.html" %} {% load i18n %} {% block object-tools %} {% if change %}{% if not is_popup %} {% endif %}{% endif %} {% endblock %} E era isso! Se nós colocarmos este arquivo no diretório ``templates/admin/my_app``, nosso link apareceria em todos os formulários de edição dos models. Templates que podem ser sobrescritos por uma app ou model --------------------------------------------------------- Nem todo template em ``contrib/admin/templates/admin`` pode ser sobrescrito por app ou por model. Os seguintes podem: * ``change_form.html`` * ``change_list.html`` * ``delete_confirmation.html`` * ``object_history.html`` Para a maioria dos templates que não são sobrescritos desta forma, você pode ainda sobrescrevê-los pra o seu projeto inteiro. É só colocar uma nova versão no seu diretório ``templates/admin``. Este é particularmente útil para criar páginas de erro 404 e 500. .. note:: Alguns dos templates do admin, como o ``change_list_request.html`` são usados para renderizar inclusion tags personalizadas. Estas podem ser sobrescritas, mas em alguns casos provavelmente é melhor você criar sua própria versão da tag em questão e dá-lhe um nome diferente. Desta forma você pode usá-la seletivamente. Template raiz e de login ------------------------ Se você deseja mudar o template index ou de login, seria melhor você criar sua própria instância de ``AdminSite`` (veja abaixo), e mudar as propriedades :attr:`AdminSite.index_template` ou :attr:`AdminSite.login_template`. Objetos ``AdminSite`` ===================== Um site de administração do Django é representado por uma instância do ``django.contrib.admin.sites.AdminSite``; por padrão, uma instância desta classe é criada como ``django.contrib.admin.site`` e você pode registrar seus models e instâncias do ``modelAdmin`` nele. Se você gostaria de configurar de setar sua própria interface de administração com comportamentos personalizados, contudo, você é livre para extender o ``AdminSite`` e sobrescrever ou adicionar qualquer coisa que queira. Então, simplesmente crie uma instância de sua classe extendida do ``AdminSite`` (da mesma forma como você instancia qualquer outra classe Python), e registre seus models e subclasses de ``ModelAdmin`` com ele ao invés de usar o padrão. Atributos do ``AdminSite`` -------------------------- .. attribute:: AdminSite.index_template Caminho para um template personalizado que será usado pela página principal do site de administração. Os templates podem sobrescrever ou extender os templates base do admin como descrito em `Sobrescrevendo Templates do Admin`_. .. attribute:: AdminSite.login_template Caminho para um templates personalizado que será usado pela página de login do site admin. Os templates podem sobrescrever ou extender os templates base do admin como descrito em `Sobrescrevendo Templates do Admin`_. Vinculando instâncias do ``AdminSite`` ao seu URLconf ----------------------------------------------------- O último passo ao configurar o admin do Django é vincular o sua instância ``AdminSite`` dentro do seu URLconf. Faça isso apontando uma certa URL para o método ``AdminSite.urls``. Neste exemplo, nós registramos a instância padrão ``AdminSite`` do ``django.contrib.admin.site`` na URL ``/admin`` :: # urls.py from django.conf.urls.defaults import * from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', ('^admin/(.*)', admin.site.root), ) Acima nós usamos ``admin.autodiscover()`` para automaticamente carregar os módulos admin.py do ``INSTALLED_APPS``. Neste exemplo, nós registramos a instância do ``AdminSite`` ``myproject.admin.admin_site`` na URL ``/myadmin/`` :: # urls.py from django.conf.urls.defaults import * from myproject.admin import admin_site urlpatterns = patterns('', ('^myadmin/(.*)', admin_site.root), ) Realmente não há necessidade de usar o autodiscover quando estiver usando sua própria instância do ``AdminSite``, tendo em vista que você provavelmente já tenha importado todos os seus módulos admin.py das aplicações no seu módulo ``myproject.admin``. Note que a expressão regular no URLpattern *deve* agrupar tudo que vier após a raiz da URL -- por isso o ``(.*)`` nestes exemplos. Vários sites admin no mesmo URLconf ----------------------------------- É fácil criar várias instâncias de admin no mesmo site feito em Django. É só criar várias instâncias do ``AdminSite`` e colocá-los em URLs diferentes. Neste exemplo, as URLs ``/baisc-admin/`` e ``/advanced-admin/`` realçam versões separadas do site admin -- usando as instâncias do ``AdminSite`` ``myproject.admin.basic_site`` e ``myproject.admin.advanced_site``, respectivamente:: # urls.py from django.conf.urls.defaults import * from myproject.admin import basic_site, advanced_site urlpatterns = patterns('', ('^basic-admin/(.*)', basic_site.root), ('^advanced-admin/(.*)', advanced_site.root), )