segunda-feira, 26 de março de 2018

Tutorial 9 de 10

Codificando uma app simples

Usando o admin do Django:

Vamos iniciar registrando o model Questao no admin.py.
Edite o arquivo admin.py:

from django.contrib import admin
from .models import Questao
admin.site.register(Questao)

Através da linha admin.site.register(Questao), o Django constrói um formulário padrão para representá-lo. 

Se desejar customizar o formulário é necessário aprimorar a codificação do admin.py. Podemos fazer da seguinte forma:

from django.contrib import admin
from .models import Questao
class QuestaoAdmin(admin.ModelAdmin):
    fields = ['data_pub', 'texto_questao']
admin.site.register(Questao, QuestaoAdmin)

Este é o padrão, criar uma classe do model e passá-la como 2º argumento para o register().
Esta mudança codificada acima faz com que o campo 'Data de publicação' apareça acima do campo 'Texto Questão'.
--------------------------------------------------------------------
Em necessidade, é possível dividir o formulário em grupos.
Continue editando o admin.py e veja.

from django.contrib import admin
from .models import Questao
class QuestaoAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['texto_questao']}),
        ('Informações de Data', {'fields': ['data_pub']}),
    ]
admin.site.register(Questao, QuestaoAdmin)

O 1º elemento de cada tupla em fieldsets é o título do grupo.
--------------------------------------------------------------------
Adicionando objetos relacionados:

Incluímos a página de administração Questão, vamos adicionar também a página de administração Escolha.
A forma mais simples é registrar Escolha no site de Administração, como foi feito com Questão. Edite o arquivo admin.py:

from django.contrib import admin
from .models import Escolha, Questao
# ...
admin.site.register(Escolha)

Agora 'Escolhas' é uma opção disponível no site de administração do Django. 

No formulário de 'Adicionar Escolha' o campo 'Questão' é uma caixa de seleção contendo todas as Questões (enquetes) cadastradas no banco de dados. O Django sabe que uma ForeignKey deve ser representada no site de administração como um campo <select>. 

Observe também o link 'Adicionar Outro' ao lado de Questao'. Todo objeto com um relacionamento de chave estrangeira para outro exibe essa opção. Quando você clica em 'Adicionar Outro', você terá uma janela popup com o formulário 'Adicionar Questao'. Se você adicionar uma Questão na janela e clicar em 'Salvar', o Django salvará a Questão (enquete) no banco de dados e irá dinamicamente adicionar a opção já selecionada ao formulário 'Adicionar Escolha'.

Mas essa é uma maneira ineficiente de adicionar objetos Escolha ao sistema. Seria muito melhor se puder adicionar várias opções diretamente quando criasse um objeto Questao. Vamos fazer isso.

Editando arquivo admin.py, remova a chamada register() do modelo Escolha. Faça outras alterações como segue:

from django.contrib import admin
from .models import Escolha, Questao

class EscolhaInline(admin.StackedInline):
    model = Escolha
    extra = 3
class QuestaoAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['texto_questao']}),
        ('Informação de Data', {'fields': ['data_pub'], 'classes': ['collapse']}),
    ]
    inlines = [EscolhaInline]
admin.site.register(Questao, QuestaoAdmin)

Agora, objetos 'Escolha' são editados na mesma página de admin de 'Questao'. Por padrão, fornece campos para 3 escolhas, como especificado em 'extra'.

No final dos 3 blocos fornecidos para o cadastro de Escolha, tem um link 'Adicionar outra escolha'. Se clicar neste link, é adicionado um novo bloco de cadastro de 'Escolha'. Se desejar remover este bloco adicional, clique no X no topo direito do bloco acrescentado. O usuário não pode remover os 3 blocos originais. 
Desta forma, a tela de cadastro de Questão e Escolha relacionadas ocupa bastante espaço da tela. Mas o Django fornece outra forma de exibir cada objeto relacionado, em uma única linha.
Para fazer esta alteração, mude no arquivo admin.py a declaração abaixo: 
...
class EscolhaInline(admin.TabularInline):
    #...

Com o TabularInline (em vez de StackedInline), os objetos relacionados são exibidos de forma mais compacta, formatados em tabela.
Neste design, há uma coluna 'Apagar?', que permite a remoção de Escolhas, que já foram salvas. Para utilizá-la, basta selecionar esta opção e clicar em Salvar.
--------------------------------------------------------------------
Obs.: 
Em settings.py, podemos alterar versões de Idioma e Fuso horário do admin. Para isso, basta alterar as opções como abaixo:
...
LANGUAGE_CODE = 'pt-br'
TIME_ZONE = 'America/Sao_Paulo' 
...

Outra alteração importante é a versão Plural do nome dos Models.
Por padrão, o plural utilizado no admin é com o acréscimo de 'S' ao 'verbose_name'. Com base na classe 'Questao', teremos o plural no admin Questaos, sendo que o correto seria 'Questões'. Para fazer esta alteração, edite o arquivo models.py e acrescente o código abaixo dentro da classe Questao:
    class Meta:
        verbose_name = 'Questão'
        verbose_name_plural = 'Questões'
--------------------------------------------------------------------

Nenhum comentário:

Postar um comentário

Tutorial 10 de 10

Codificando uma app simples Continuando a alteração no admin... Personalizando a listagem da página de Administração: Vamos fazer melh...