terça-feira, 27 de março de 2018

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 melhorias na página admin de Questão que exibe todas as Questões (enquetes) cadastradas.

Por padrão, o Django mostra o str() de cada objeto. Mas é possível mostrar campos individuais. Para tal, use a opção 'list_display', que é uma tupla de nomes de campos a serem exibidos, como colunas. Edite o arquivo admin.py, a classe QuestaoAdmin e insira a linha abaixo:

# ...
    list_display = 
    ('texto_questao', 'data_pub')

Vamos incluir também o método 'was_published_recently()':
# ...
    list_display = 
    ('texto_questao', 'data_pub', 'was_published_recently')

Você pode clicar no cabeçalho da coluna para ordená-las por estes valores – exceto no caso da coluna 'was_published_recently', 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_recently é, por padrão, o nome do método (com underscores substituídos por espaços), e que cada linha contem a representação da saída.
--------------------------------------------------------------------
Vamos melhorar esta exibição, adicionando atributos ao método em questão. Edite o arquivo models.py, como segue:

class Questao(models.Model):
    # ...
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.data_pub <= now
    was_published_recently.admin_order_field = 'data_pub'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Publicado Recentemente?'

Uma melhoria para a página de edição de 'Questao': 
Adicionar um filtro: edite o arquivo admin.py e adicione o código abaixo, dentro da classe 'QuestaoAdmin': 
... list_filter = ['data_pub']
...

Isso adicionará uma barra lateral 'Filtro' que permite filtrar a lista de edição pelo campo 'data_pub' ('Data de Publicação').
--------------------------------------------------------------------
O tipo do filtro apresentado depende do tipo do campo pelo qual você está filtrando. Por conta de data_pub ser uma instância da classe DateTimeField, o Django consegue deduzir que os filtros apropriados são: 
'Qualquer data'
'Hoje'
'Últimos 7 dias'
'Este mês'
'Este ano'
'Sem data'
'Tem data'

Agora, vamos adicionar capacidade de pesquisa:
Insira o código abaixo do código adicionado anteriormente:
search_fields = ['texto_questao']

Isso adiciona um campo de pesquisa ao topo da lista de edição. Quando alguém informa termos de pesquisa, o Django irá pesquisar o campo 'texto_questao'. Você pode usar quantos campos quiser, mas por ele usar uma consulta LIKE internamente, limitar o número de campos de pesquisa a um número razoável, será mais fácil para o seu banco de dados para fazer pesquisas.

Observe que a página de edição fornece uma paginação por padrão. O padrão é mostrar 100 itens por página. 
Paginação da página de edição, campos de pesquisa, filtros, hierarquia por data, e ordenação por cabeçalho de coluna, todos trabalham em sincronia como deveriam.
--------------------------------------------------------------------
Personalizando os templates do seu projeto:

Crie um diretório templates no diretório do seu projeto (aquela que contém manage.py). Os templates podem estar em qualquer lugar em seu sistema de arquivos que o Django possa acessar. (Django é executado como qualquer usuário que seu servidor é executado). No entanto, manter seus templates dentro do projeto é uma boa convenção a seguir.

Abra o arquivo settings.py e adicione uma opção DIRS, configuração TEMPLATES: mysite/settings.py
...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], #Esta Linha
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
...

DIRS é uma lista de diretórios de arquivos que serão checados quando o Django carregar seus templates, ou seja, caminhos de busca.
--------------------------------------------------------------------
Organizando templates:

Assim como os arquivos estáticos, poderíamos ter todos os nossos templates juntos no mesmo diretório. Contudo, templates que pertencem a um app devem ser colocados no diretório de templates da aplicação, exemplo: votacao/templates.

Onde estão os arquivos de código-fonte do Django?
Execute o seguinte comando:
python -c "import django; print(django.__path__)"

# Saída: ['C:\\marco\\venv\\lib\\site-packages\\django']
--------------------------------------------------------------------
Personalizando a aparência do Site de Administração:

Vamos fazer algumas alterações, como o título da área administrativa do Django, que atualmente está como 'Django administration' no topo página. Para esta alteração usaremos o sistema de templates do Django.
Obs.: A página de administração de Django é feita com o próprio Django e conseqüentemente sua interface usa o sistema de templates nativo do Django.

Crie um diretório admin dentro de templates, e copie o template admin/base_site.html de dentro do diretório padrão do site de administração do Django (django/contrib/admin/templates) para dentro deste diretório.
Agora, edite o arquivo base_site.html e substitua:

{{ site_header|default:_('Django administration') }} 

(incluindo as chaves) com nome do seu próprio site como desejar. 
Você deve acabar com uma seção de código como:

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">
Administração de Questões</a></h1>
{% endblock %}

Nós usamos esta abordagem para ensinar-lhe como substituir templates. Em um projeto real, você provavelmente usaria o atributo django.contrib.admin.AdminSite.site_header para fazer mais facilmente essa personalização em particular.

Esse template contém uma série de textos como {% block branding %} e {{ tittle }}. As tags {% e {{ fazem pate da linguagem de templates do Django. Quando o Django renderiza este template 'base_site.html', o seu conteúdo é processado por essa linguagem de templates para produzir a página HTML final.

Qualquer template padrão do site de administração pode ser sobrescrito. Para sobrescrever um template, apenas faça a mesma coisa que você fez com base_site.html, basta copiá-lo do diretório padrão para o seu próprio diretório, e fazer as mudanças.
--------------------------------------------------------------------
Personalizando templates da sua aplicação:

Obs.: Mas se DIRS estava vazio por padrão, como o Django pôde encontrar o diretório padrão dos templates do site de administração? 
A resposta é, Desde que APP_DIRS seja True, o Django irá automaticamente procurar por um subdiretório templates/ dentro de cada pacote de aplicação, para usar como fallback (django.contrib.admin é uma aplicação).

A aplicação enquete não é muito complexa e não precisa de templates personalizados para o site de administração. Mas se ele crescer e ficar mais sofisticado e necessária a modificação dos templates padrão de administração do Django para algumas de suas funcionalidades, seria mais sensato modificar os templates da aplicação, e não os do projeto. 

Dessa forma, você poderia incluir a aplicação de enquete em qualquer novo projeto e ter a certeza que iria encontrar os modelos personalizados que você precisa.
--------------------------------------------------------------------
Personalize a página inicial do site de administração:

De maneira similar, você pode querer personalizar a aparência da página inicial do site de administração do Django.
Por padrão, ele exibe todas as aplicações em INSTALLED_APPS, que estão registrados na aplicação de administração, em ordem alfabética. E você pode querer fazer alterações significativas no layout. Além do que, a página inicial é provavelmente a página mais importante da página de administração, e deve ser fácil de usar.
O template para personalizar é admin/index.html. (Faça o mesmo que admin/base_site.html na seção anterior – copie ele do diretório padrão para o seu diretório de template personalizado). Edite o arquivo e você verá que ele usa uma variável de template chamada app_list. Esta variável contém cada app instalada no Django. Ao invés de usar isto, você pode criar links hard-coded para páginas do admin específicas em qualquer forma que você achar melhor.

Fim do Tutorial.
Este tutorial foi estudado com base no Tutorial com o link abaixo.
https://docs.djangoproject.com/pt-br/2.0/intro/
Meus agradecimentos ao autor do Tutorial do site DjangoProject.com.
--------------------------------------------------------------------

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...