Escolar Documentos
Profissional Documentos
Cultura Documentos
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Finalmente chegamos ao nosso último post sobre Django (pelo menos dessa série -
com certeza ainda teremos muito conteúdo sobre Django, ok?!)
web-com-
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Django: A Camada Model (https://pythonacademy.com.br/blog/desenvolvimento-
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
web-com-python-e-django-model)
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Django: A Camada View (https://pythonacademy.com.br/blog/desenvolvimento-
web-com-python-e-django-view)
Então cadastre o seu email para receber gratuitamente mais conteúdos como
este!
Nesse post, vamos tratar da camada que dá a “cara” à nossa aplicação: a Camada
Template!
É nela que se encontra o código Python, responsável por renderizar nossas páginas
web, e os arquivos HTML, CSS e Javascript que darão vida à nossa aplicação!
Vamos tratar das configurações necessárias para fazer essa camada funcionar
corretamente, das ferramentas built-ins do Django para construção de templates, da
Django Template Language: sua sintaxe, tags, filters, e muito mais!
Está curioso?
Vá Direto ao Assunto…
Gostou do conteúdo? Compartilha aí!
Onde estamos…
web-com-
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Definição de Template
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
Configuração
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Django Template Language
Tags e Filtros customizados
Built-in Filters
Onde estamos…
Primeiro, vamos relembrar onde estamos no fluxo requisição/resposta do nosso
servidor Django:
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Ou seja, estamos na camada que faz a interface do nosso código Python/Django com
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
o usuário, interagindo, trocando informações, captando dados de input e gerando
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
dados de output.
Caso você não tenha o código que estamos desenvolvendo nessa séries de posts (o
conhecido Hello World), baixe-o aqui (/assets/posts/django-template/helloworld.zip)!
Definição de Template
Basicamente, um template é um arquivo de texto que pode ser transformado em
outro arquivo (um arquivo HTML, um CSS, um CSV, etc…).
Um template contém:
Por exemplo, abaixo está representado um template mínimo que demonstra alguns
conceitos básicos:
Gostou do conteúdo? Compartilha aí!
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
tal{#
Que umbase.html contém
curso que reúneo Programação
template que usaremos
Python,como esqueleto
Projetos #}
3
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
4
{% block conteudo %}
5
<h1>{{ section.title }}</h1>
7
{% for funcionario in funcionarios %}
8
<h2>
9
<a href="{% url 'website:funcionario_detalhe' pk=funcionario.id %}">
10
{{ funcionario.nome|upper }}
11
</a>
12
</h2>
13
{% endfor %}
14
{% endblock %}
Linha 10: Podemos utilizar filtros para aplicar alguma função à algum
conteúdo. Nesse exemplo, estamos aplicando o filtro upper , que transforma
todos os caracteres da string em maísculos, no conteúdo de funcionario.nome .
Também é possível encadear filtros, por exemplo: {{
funcionario.nome|upper|cut:" " }}
Chamaram-na de DTL - Django Template Language! Veremos mais dela ali embaixo!
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Configuração
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Se você já deu uma espiada no nosso arquivo de configurações, o settings.py , você
já deve ter visto a seguinte configuração:
1
TEMPLATES = [
2
{
3
'BACKEND': 'django.template.backends.django.DjangoTemplates',
4
'DIRS': [],
5
'APP_DIRS': True,
6
'OPTIONS': {},
7
},
8
]
Nela:
Django.
DIRS define uma lista de diretórios onde o Django deve procurar por
Por ora, vamos utilizar as configurações padrão “de fábrica” pois elas já nos
atendem!
web-com-
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Se você tem alguma experiência em programação, ou se você está acostumado
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
com linguagens que misturam código de programação diretamente no HTML,
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
você deve ter em mente que o sistema de templates do Django não é simplesmente
código Python embutido no HTML. Isto é: o sistema de templates foi desenhado
para ser a apresentação, e não para conter lógica!
Se você vem de outra linguagem de programação deve ter tido contato com o
seguinte tipo de construção: código de programação adicionado diretamente no
código HTML (como PHP).
Ponha-se no lugar de um designer que não sabe nada sobre programação. Agora
imagina você tendo que dar manutenção nos estilos de uma página LOTADA de
código de programação?!
Complicado, hein?!
Agora, nada melhor para aprender sobre a DTL do que botando a mão na massa e
melhorando as páginas da nossa aplicação, né?!
Alterações no projeto
Para dar continuidade no nosso projeto, vamos fazer as seguintes alterações:
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Dentro dessa pasta ( /static/website/ ), crie as pastas css , img e js (arquivos
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
.css, imagens e Javascript).
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Adicione o parâmetro name='' às URLs no arquivo website/urls.py , da
seguinte forma:
1
urlpatterns = [
2
# '/'
3
path('',
4
IndexTemplateView.as_view(),
5
name="index" # <<< Adicionar
6
),
8
# '/funcionario/cadastrar'
9
path('funcionario/cadastrar',
10
FuncionarioCreateView.as_view(),
11
name="cadastra_funcionario" # <<< Adicionar
12
),
13
14
# '/funcionarios'
15
path('funcionarios/',
16
FuncionarioListView.as_view(),
17
name="lista_funcionarios" # <<< Adicionar
18
),
19
20
# '/funcionario/{pk}'
21
path('funcionario/<pk>',
22
FuncionarioUpdateView.as_view(),
23
name="atualiza_funcionario" # <<< Adicionar
24
),
25
26
# '/funcionarios/excluir/{pk}'
27
path('funcionario/excluir/<pk>',
28
FuncionarioDeleteView.as_view(),
29
name="deleta_funcionario" # <<< Adicionar
30
),
31
]
Observação: Nós criamos uma pasta com o nome do app ( website , no caso) dentro
das pastas static e templates para que o Django crie o namespace do app. Dessa
forma, o Django entende onde buscar os recursos quando você precisar!
Estrutura do projeto
Template-base
web-com-
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Nosso template que servirá de esqueleto deve conter o código HTML que irá se
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
repetir em todas as páginas.
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Devemos colocar nele os trechos de código mais comuns das páginas HTML.
Você pode fazer o download dos arquivos necessários para o nosso projeto aqui
(Bootstrap) (https://getbootstrap.com/docs/4.1/getting-started/download/) e aqui
(jQuery) (https://jquery.com/download/), que é uma dependência do Bootstrap, ou
utilizar os arquivos que eu já baixei e estão na pasta website/static/ .
Faça isso para todos as bibliotecas externas que queira utilizar (ou utilize um CDN -
Content Delivery Network
(https://pt.wikipedia.org/wiki/Rede_de_fornecimento_de_conte%C3%BAdo)).
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
Que tal<!DOCTYPE
um cursohtml>
3
{% load CONHECER
static %}
5
<!-- Title -->
6
<title>
7
{% block title %}Sistema de Gerenciamento de Funcionários{% endblock %}
8
</title>
10
<!-- Favicon -->
11
<link rel="shortcut icon" href="{% static 'website/img/favicon.png' %}" type=
12
13
<!-- Arquivos CSS -->
14
<link rel="stylesheet" href="{% static 'website/css/bootstrap.min.css' %}">
15
<link rel="stylesheet" href="{% static 'website/css/master.css' %}">
16
17
<!-- Bloco de Estilos -->
18
{% block styles %}{% endblock %}
19
</head>
20
21
<body>
22
<!-- Navbar -->
23
<nav class="navbar navbar-expand-lg navbar-light bg-light">
24
<a class="navbar-brand" href="{% url 'website:index' %}">
25
<img src="{% static 'website/img/favicon.png' %}" height='45px'>
26
</a>
27
<button class="navbar-toggler" type="button"
28
data-toggle="collapse" data-target="#conteudo-navbar"
29
aria-controls="conteudo-navbar" aria-expanded="false"
30
aria-label="Ativar navegação">
31
<span class="navbar-toggler-icon"></span>
32
</button>
33
34
<div class="collapse navbar-collapse" id="conteudo-navbar">
35
<ul class="navbar-nav mr-auto">
36
<li class="nav-item active">
37
<a class="nav-link" href="{% url 'website:index' %}">
38
Página Inicial
39
</a>
40
</li>
41
<li class="nav-item">
42
<a class="nav-link" href="{% url 'website:lista_funcionario'
43
Funcionários
44
</a>
45
</li>
46
</ul>
47
</div>
48
</nav>
49
50
<!-- Bloco de conteúdo -->
51
{% block conteudo %}{% endblock %}
52
Gostou do conteúdo? Compartilha aí!
53
<!-- Arquivos necessários para o Bootstrap -->
54
55
<script src="{%
<script src="{% static 'website/js/jquery.min.js' %}"></script>
(https://api.whatsapp.com/send?
template)
django-
static 'website/js/bootstrap.min.js'
text=https://pythonacademy.com.br/blog/d
web-com-
python-e-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
%}"></script>
56
57
Que
58
tal um<!--
curso que de
Bloco reúne Programação
scripts -->
Python, Projetos Reais e Dicas de Carreira?
59
{% block scripts %}{% endblock %}
60
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
61
<!-- Scripts.js -->
62
<script src="{% static 'website/js/scripts.js' %}"></script>
63
</body>
</html>
E vamos as explicações:
páginas que irão estender desse template. Podemos passar um valor padrão
dentro do bloco (igual está sendo utilizado na linha 6) - dessa forma caso não
seja definido nenhum valor no template filho - é aplicado o valor padrão.
Colocamos nesse template os arquivos necessários para o funcionamento do
Bootstrap, isto é: o jQuery, o CSS e Javascript do Bootstrap.
O link para outras páginas da nossa aplicação é feito utilizando-se a tag {% url
'nome_da_view' parametros... %} . Dessa forma, deixamos que o Django cuide
exclusiva lista de pythonistas
viciados em
conteúdo
de qualidade?
(https://api.whatsapp.com/send?
web-com-
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Não? Então já aproveita!!!
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Página Inicial
Template: website/index.html
Nossa tela inicial tem o objetivo de apenas mostrar as opções disponíveis ao usuário,
que são:
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
tal<!--
Que Estendemos
um curso do template
que reúne base -->
Python, Projetos Reais e Dicas de Carreira?
Programação
2
{% extends "website/_layouts/base.html" %}
3
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
4
<!-- Bloco que define o <title></title> da nossa página -->
5
{% block title %}Página Inicial{% endblock %}
7
<!-- Bloco de conteúdo da nossa página -->
8
{% block conteudo %}
9
<div class="container">
10
<div class="row">
11
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
12
<div class="card">
13
<div class="card-body">
14
<h5 class="card-title">Cadastrar Funcionário</h5>
15
<p class="card-text">
16
Cadastre aqui um novo <code>Funcionário</code>.
17
</p>
18
<a href="{% url 'website:cadastra_funcionario' %}"
19
class="btn btn-primary">
20
Novo Funcionário
21
</a>
22
</div>
23
</div>
24
</div>
25
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
26
<div class="card">
27
<div class="card-body">
28
<h5 class="card-title">Lista de Funcionários</h5>
29
<p class="card-text">
30
Veja aqui a lista de <code>Funcionários</code> cadastrados.
31
</p>
32
<a href="{% url 'website:lista_funcionarios' %}"
33
class="btn btn-primary">
34
Vá para Lista
35
</a>
36
</div>
37
</div>
38
</div>
39
</div>
40
</div>
41
{% endblock %}
Nesse template:
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
página responsiva (que se adapta aos diversos tipos e tamanhos de tela:
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
celular, tablet, desktop etc…).
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
As classes card* fazem parte do component Card do Bootstrap
(https://getbootstrap.com/docs/4.0/components/card/).
As classes btn e btn-primary (documentação
(https://getbootstrap.com/docs/4.0/components/buttons/)) são usados para dar
o visual de botão à algum elemento.
Com isso, nossa Página Inicial - ou nossa Homepage - deve ficar assim:
Página Inicial
Top, hein?!
Está aprendendo Django mas ainda não sabe criar páginas web INCRÍVEIS
com HTML5, CSS3 e Bootstrap 4? Aprenda AGORA com esse curso COMPLETO!
Pois então… Dessa forma, nossa View FuncionarioCreateView expõe um objeto form
no nosso template para que possamos utilizá-lo.
1
pip install django-widget-tweaks
1
INSTALLED_APPS = [
2
...
3
'widget_tweaks',
4
...
5
]
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
Que tal{%
umextends "website/_layouts/base.html"
curso que reúne Programação Python,%}
Projetos Reais e Dicas de Carreira?
2
3
{% load widget_tweaks
QUERO CONHECER
%}
JORNADA PYTHON
( /JORNADA-PYTHON/ )
4
5
{% block title %}Cadastro de Funcionários{% endblock %}
7
{% block conteudo %}
8
<div class="container">
9
<div class="row">
10
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
11
<div class="card">
12
<div class="card-body">
13
<h5 class="card-title">Cadastro de Funcionário</h5>
14
<p class="card-text">
15
Complete o formulário abaixo para cadastrar
16
um novo <code>Funcionário</code>.
17
</p>
18
<form method="post">
19
<!-- Não se esqueça dessa tag -->
20
{% csrf_token %}
21
22
<!-- Nome -->
23
<div class="input-group mb-3">
24
<div class="input-group-prepend">
25
<span class="input-group-text">Nome</span>
26
</div>
27
{% render_field form.nome class+="form-control" %}
28
</div>
29
30
<!-- Sobrenome -->
31
<div class="input-group mb-3">
32
<div class="input-group-prepend">
33
<span class="input-group-text">Sobrenome</span>
34
</div>
35
{% render_field form.sobrenome class+="form-control" %}
36
</div>
37
38
<!-- CPF -->
39
<div class="input-group mb-3">
40
<div class="input-group-prepend">
41
<span class="input-group-text">CPF</span>
42
</div>
43
{% render_field form.cpf class+="form-control" %}
44
</div>
45
46
<!-- Tempo de Serviço -->
47
<div class="input-group mb-3">
48
<div class="input-group-prepend">
49
<span class="input-group-text">Tempo de Serviço</span>
50
</div>
51
{% render_field form.tempo_de_servico class+="form-control" %}
52
</div>
Gostou do conteúdo? Compartilha aí!
53
54
55
<!-- Remuneração -->
<div
class="input-group mb-3">
(https://api.whatsapp.com/send?
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
56
57
<div class="input-group-prepend">
Que
58
tal um curso que reúne
<span Programação Python, Projetos Reais e Dicas de Carreira?
class="input-group-text">Remuneração</span>
59
</div>
60
QUERO CONHECER
JORNADA
{% render_field
( /JORNADA-PYTHON/
PYTHONclass+="form-control"
form.remuneracao %}
)
61
</div>
62
63
<button class="btn btn-primary">Enviar</button>
64
</form>
65
</div>
66
</div>
67
</div>
68
</div>
69
</div>
{% endblock %}
Aqui:
1
class InsereFuncionarioForm(forms.ModelForm):
2
...
3
nome = forms.CharField(
4
max_length=255,
5
widget=forms.TextInput(
6
attrs={
7
'class': "form-control"
8
}
9
)
10
)
11
...
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Mas eu não aconselho fazer isso, pois deixa nosso código extremamente acoplado.
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
Veja que para mudar a classe CSS (atributo da interface) teremos que mudar código
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Python (backend). Por isso, aconselho a utilização de ferramentas para tal, como o
Widget Tweaks, pois alteramos código apenas no template!
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
Que tal{%
umextends "website/_layouts/base.html"
curso que reúne Programação Python,%}
Projetos Reais e Dicas de Carreira?
2
3
{% block title %}Lista de Funcionários{% endblock %}
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
4
5
{% block conteudo %}
6
<div class="container">
7
<div class="row">
8
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
9
<div class="card">
10
<div class="card-body">
11
<h5 class="card-title">Lista de Funcionário</h5>
12
13
{% if funcionarios|length > 0 %}
14
<p class="card-text">
15
Aqui está a lista de <code>Funcionários</code> cadastrados.
16
</p>
17
18
<table class="table">
19
<thead class="thead-dark">
20
<tr>
21
<th>ID</th>
22
<th>Nome</th>
23
<th>Sobrenome</th>
24
<th>Tempo de Serviço</th>
25
<th>Remuneração</th>
26
<th>Ações</th>
27
</tr>
28
</thead>
29
30
<tbody>
31
{% for funcionario in funcionarios %}
32
<tr>
33
<td>{{ funcionario.id }}</td>
34
<td>{{ funcionario.nome }}</td>
35
<td>{{ funcionario.sobrenome }}</td>
36
<td>{{ funcionario.tempo_de_servico }}</td>
37
<td>{{ funcionario.remuneracao }}</td>
38
<td>
39
<a href="{% url 'website:atualiza_funcionario' pk=funcionario
40
class="btn btn-info">
41
Atualizar
42
</a>
43
<a href="{% url 'website:deleta_funcionario' pk=funcionario.i
44
class="btn btn-outline-danger">
45
Excluir
46
</a>
47
</td>
48
</tr>
49
{% endfor %}
50
</tbody>
51
</table>
52
{% else %}
Gostou do conteúdo? Compartilha aí!
53
<div class="text-center mt-5 mb-5 jumbotron">
54
55
</div>
python-e-
template)
django-
<h5>Nenhum <code>Funcionário</code> cadastrado ainda.</h5>
(https://api.whatsapp.com/send?
text=https://pythonacademy.com.br/blog/d
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
56
57
{% endif %}
Que
58
tal um curso<hr
que/>
60
QUERO CONHECER
62
</a>
63
</div>
64
</div>
65
</div>
66
</div>
67
</div>
68
</div>
{% endblock %}
Nesse template:
Quando o usuário clicar em “Excluir”, ele será levado para a página exclui.html e
quando clicar em “Atualizar”, ele será levado para a página atualiza.html .
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Template de Atualização de Funcionários
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
QUERO
Template: CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
website/atualiza.html
Nessa página, queremos que o usuário possa ver os dados atuais do Funcionário e
possa atualizá-los, conforme sua vontade.
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
Que tal{%
umextends "website/_layouts/base.html"
curso que reúne Programação Python,%}
Projetos Reais e Dicas de Carreira?
2
3
{% load widget_tweaks
QUERO CONHECER
%}
JORNADA PYTHON
( /JORNADA-PYTHON/ )
4
5
{% block title %}Atualização de Dados do Funcionários{% endblock %}
7
{% block conteudo %}
8
<div class="container">
9
<div class="row">
10
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
11
<div class="card">
12
<div class="card-body">
13
<h5 class="card-title">Atualização de Dados do Funcionário</h5>
14
<form method="post">
15
<!-- Não se esqueça dessa tag -->
16
{% csrf_token %}
17
18
<!-- Nome -->
19
<div class="input-group mb-3">
20
<div class="input-group-prepend">
21
<span class="input-group-text">Nome</span>
22
</div>
23
{% render_field form.nome class+="form-control" %}
24
</div>
25
26
<!-- Sobrenome -->
27
<div class="input-group mb-3">
28
<div class="input-group-prepend">
29
<span class="input-group-text">Sobrenome</span>
30
</div>
31
{% render_field form.sobrenome class+="form-control" %}
32
</div>
33
34
<!-- CPF -->
35
<div class="input-group mb-3">
36
<div class="input-group-prepend">
37
<span class="input-group-text">CPF</span>
38
</div>
39
{% render_field form.cpf class+="form-control" %}
40
</div>
41
42
<!-- Tempo de Serviço -->
43
<div class="input-group mb-3">
44
<div class="input-group-prepend">
45
<span class="input-group-text">Tempo de Serviço</span>
46
</div>
47
{% render_field form.tempo_de_servico class+="form-control" %}
48
</div>
49
50
<!-- Remuneração -->
51
<div class="input-group mb-3">
52
Gostou do conteúdo? Compartilha aí!
<div class="input-group-prepend">
53
<span class="input-group-text">Remuneração</span>
54
55
</div>
{% render_field form.remuneracao
(https://api.whatsapp.com/send?
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
class+="form-control"django-
%}
56
57
</div>
Que
58
tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
59
<button class="btn btn-primary">Enviar</button>
60
QUERO CONHECER
</form>
JORNADA PYTHON
( /JORNADA-PYTHON/ )
61
</div>
62
</div>
63
</div>
64
</div>
65
</div>
{% endblock %}
Nesse template, não temos nada de novo. Perceba que seu código é similar ao
template de adição de Funcionários.
A função dessa página é mostrar uma página de confirmação para o usuário antes
da exclusão de um Funcionário.
A view que fizemos, a FuncionarioDeleteView , facilita bastante nossa vida. Com ela,
basta dispararmos uma requisição POST para a URL de exclusão!
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
tal<!--
Que Estendemos
um curso do template
que reúne base -->
Python, Projetos Reais e Dicas de Carreira?
Programação
2
{% extends "website/_layouts/base.html" %}
3
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
4
<!-- Bloco que define o <title></title> da nossa página -->
5
{% block title %}Página Inicial{% endblock %}
7
<!-- Bloco de conteúdo da nossa página -->
8
{% block conteudo %}
9
<div class="container mt-5">
10
<div class="card">
11
<div class="card-body">
12
<h5 class="card-title">Exclusão de Funcionário</h5>
13
14
<p class="card-text">
15
Você tem certeza que quer excluir o funcionário
16
<b>{{ funcionario.nome }}</b>?
17
</p>
18
19
<form method="post">
20
{% csrf_token %}
21
22
<hr />
23
<div class="text-right">
24
<a href="{% url 'website:lista_funcionarios' %}"
25
class="btn btn-outline-danger">
26
Cancelar
27
</a>
28
<button class="btn btn-danger">Excluir</button>
29
</div>
30
</form>
31
</div>
32
</div>
33
</div>
34
{% endblock %}
Pronto!
Tagse Filtros
customizados
python-e-
template)
django-
(https://api.whatsapp.com/send?
text=https://pythonacademy.com.br/blog/d
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Sabemos, agora, que o Django possui uma grande variedade de filtros e tags pré-
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
configurados.
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Contudo, é possível que, em alguma situação específica, o Django não te ofereça o
filtro ou tag necessário.
Para isso, ele previu a possibilidade de você construir seus próprios filtros e tags!
Vamos construir uma tag que irá nos dizer o tempo atual formatado e um filtro que
irá retornar a primeira letra da string passada.
Configuração
Para utilizar tags e filtros customizados, precisamos criar uma pasta chamada
/templatetags na raíz do app.
1
website/
2
...
3
templatetags/
4
__init__.py
5
tempo_atual.py
6
primeira_letra.py
7
...
Para que o Django enxergue nossas tags e filtros é necessário que o app onde eles
estão instalada esteja configurada na lista INSTALLED_APPD do settings.py (no nosso
caso, website já está lá, portanto, nada a fazer aqui).
Vamos começar com o filtro.
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Vamos chamá-lo de primeira_letra e iremos utilizá-lo da seguinte maneira:
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
1
QUERO
<p>{{ CONHECER
Filtro primeira_letra
Filtros customizados são apenas funções que recebem um ou dois argumentos. São
eles:
O valor do input.
O valor do argumento - que pode ter um valor padrão ou não receber nenhum
valor.
Nosso filtro não receberá argumentos, portanto não foi passado nada como tal.
Para ser um filtro válido, é necessário que o código dele contenha uma variável
chamada register que seja uma instância de template.Library (onde todos os tags
e filtros são registrado).
Por isso, nosso filtro deve evitar lançar exceções e, ao invés disso, deve retornar um
valor padrão.
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
tal
Que @register.filter(is_safe=True)
3
def lower(value):
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
4
"""Convert a string into all lowercase."""
5
return value.lower()
Nele:
espera uma string como argumento (saiba mais sobre decorators no nosso post
Domine Decorators em Python (https://pythonacademy.com.br/blog/domine-
decorators-em-python)).
Com essas informações, vamos agora codificar e registrar nosso próprio filtro!
1
from django import template
2
from django.template.defaultfilters import stringfilter
4
register = template.Library()
6
@register.filter
7
@stringfilter
8
def primeira_letra(value):
9
return list(value)[0]
Nesse código:
Vamos alterar nossa tabela no template website/lista.html para incluir nosso filtro
da seguinte forma:
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
tal<table
Que class="table">
3
<tr> CONHECER
QUERO
JORNADA PYTHON
( /JORNADA-PYTHON/ )
4
<th><!-- Retiramos o "ID" aqui --></th>
5
<th>Nome</th>
6
<th>Sobrenome</th>
7
<th>Tempo de Serviço</th>
8
<th>Remuneração</th>
9
<th class="text-center">Ações</th>
10
</tr>
11
</thead>
12
<tbody>
13
{% for funcionario in funcionarios %}
14
<tr>
15
<!-- Aplicamos nosso filtro no atributo funcionario.nome -->
16
<td>{{ funcionario.nome|primeira_letra }}</td>
17
<td>{{ funcionario.nome }}</td>
18
<td>{{ funcionario.sobrenome }}</td>
19
<td>{{ funcionario.tempo_de_servico }}</td>
20
<td>{{ funcionario.remuneracao }}</td>
21
<td class="text-center">
22
<a href="{% url 'website:atualiza_funcionario' pk=funcionario.id %}"
23
class="btn btn-primary">
24
Atualizar
25
</a>
26
<a href="{% url 'website:deleta_funcionario' pk=funcionario.id %}"
27
class="btn btn-danger">
28
Excluir
29
</a>
30
</td>
31
</tr>
32
{% endfor %}
33
</tbody>
34
</table>
Tag tempo_atual
De acordo com a documentação do Django, “tags são mais complexas que filtros pois
podem fazer qualquer coisa“.
Gostou do conteúdo? Compartilha aí!
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Desenvolver uma tag pode ser algo bem trabalhoso, dependendo do que você deseja
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
fazer. Mas também pode ser simples.
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Como nossa tag vai apenas mostrar o tempo atual, sua implementação não deve ser
complexa.
Com ela, a criação de tags fica similar à criação de filtros, que vimos na seção
passada.
1
import datetime
2
from django import template
4
register = template.Library()
6
@register.simple_tag
7
def tempo_atual():
8
return datetime.datetime.now().strftime('%H:%M:%S')
Vamos adicionar um novo item à barra de navegação (do lado direito), da seguinte
forma:
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
tal<body>
Que um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
2
<!-- Navbar -->
3
<nav class="navbar
QUERO CONHECER
navbar-expand-lg navbar-light bg-light">
JORNADA PYTHON
( /JORNADA-PYTHON/ )
4
...
5
<div class="collapse navbar-collapse" id="navbarSupportedContent">
6
<ul class="navbar-nav mr-auto">
7
<li class="nav-item active">
8
<a class="nav-link"
9
href="{% url 'website:index' %}">
10
Página Inicial
11
</a>
12
</li>
13
<li class="nav-item">
14
<a class="nav-link"
15
href="{% url 'website:lista_funcionarios' %}">
16
Funcionários
17
</a>
18
</li>
19
</ul>
20
<!-- Adicione a lista abaixo -->
21
<ul class="navbar-nav float-right">
22
<li class="nav-item">
23
<!-- Aqui está nosso filtro -->
24
<a class="nav-link" href="#">
25
<b>Hora: </b>{% tempo_atual %}
26
</a>
27
</li>
28
</ul>
29
</div>
30
</nav>
31
...
Agora vamos dar uma olhada no filtros que estão presentes no próprio Django: os
Built-in Filters!
Built-in Filters
É possível fazer muita coisa com os filtros que já veem instalados no próprio Django!
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Como a lista de built-in filters do Django é bem extensa (veja a lista completa aqui
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
(https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#built-in-filter-
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
reference)), vou listar aqui os que eu considero mais úteis!
Filtro capfirst
O que faz: Torna o primeiro caracter do valor para maiúsculo.
Exemplo:
Utilização:
1
{{ valor|capfirst }}
Saída:
Esse é um texto
Resultado
Filtro cut
O que faz: Remove todas as ocorrências do parâmetro no valor passado.
Exemplo:
Utilização:
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Saída:
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
EsseÉUmTextoDeTestes
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Resultado
Filtro date
O que faz: Utilizado para formatar datas. Possui uma grande variedade de
configurações (veja aqui
(https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#date)).
Exemplo:
Utilização:
1
{{ data|date:'d/m/Y' }}
Saída:
01/07/2018
Resultado
Filtro default
O que faz: Caso o valor seja False , utiliza o valor default .
Exemplo:
Utilização:
1
{{ valor|default:'Nenhum valor' }}
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Que tal um
Nenhum curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
valor
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Resultado
Filtro default_if_none
O que faz: Similar ao filtro default , caso o valor seja None , utiliza o valor
configurado em default_if_none .
Exemplo:
Utilização:
1
{{ valor|default:'Nenhum valor' }}
Saída:
Nenhum valor
Resultado
Filtro divisibleby
O que faz: Retorna True se o valor for divisível pelo argumento.
Exemplo:
Utilização:
1
{{ valor|divisibleby:'2' }}
Saída:
Gostou do conteúdo? Compartilha aí!
True
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Resultado
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Filtro filesizeformat
O que faz: Transforma tamanhos de arquivos em valores legíveis por humanos.
Exemplo:
Utilização:
1
{{ valor|filesizeformat }}
Saída:
117.7 MB
Resultado
Filtro first
O que faz: Retorna o primeiro item em uma lista
Exemplo:
Utilização:
1
{{ valor|first }}
Saída:
Marcos
Resultado
Gostou do conteúdo? Compartilha aí!
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Filtro last
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
QUERO
O que faz: CONHECER
Retorna JORNADA
o último item PYTHON
( /JORNADA-PYTHON/ )
em uma lista
Exemplo:
Utilização:
1
{{ valor|last }}
Saída:
Luiz
Resultado
Filtro floatformat
O que faz: Arredonda números com ponto flutuante com o número de casas
decimais passado por argumento.
Exemplo:
Utilização:
1
{{ valor|floatformat:"2" }}
Saída:
14.25
Resultado
Filtro join
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
O que faz: Junta uma lista utilizando a string passada como argumento como
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
separador.
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Exemplo:
Utilização:
1
{{ valor|join:" - " }}
Saída:
Resultado
Filtro length
O que faz: Retorna o comprimento de uma lista ou string. É muito utilizado para
saber se existem valores na lista.
Exemplo:
Utilização:
1
{% if valor|length > 0 %}
2
<p>Lista contém valores</p>
3
{% else %}
4
<p>Lista vazia</p>
5
{% endif %}
Saída:
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Filtro lower
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
QUERO
O que faz: CONHECER
Exemplo:
Utilização:
1
{{ valor|lower }}
Saída:
paralelepípedo
Resultado
Filtro pluralize
O que faz: Retorna um sufixo plural caso o número seja maior que 1.
Exemplo:
Entrada: valor = 12
Utilização:
1
Sua empresa tem {{ valor }} Funcionário{{ valor|pluralize:"s" }}
Saída:
Resultado
web-com-
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Exemplo:
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
Utilização:
1
{{ valor|random }}
Filtro title
O que faz: Transforma em maísculo o primeiro caracter de todas as palavras do
texto.
Exemplo:
Utilização:
1
{{ valor|title }}
Saída:
Resultado
Filtro upper
O que faz: Transforma em maísculo todos caracteres da string.
Exemplo:
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
1
tal
Que {{um
valor|upper
curso que}}
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
Saída:
TEXTO DE TESTES
Resultado
Filtro wordcount
O que faz: Retorna o número de palavras da string.
Exemplo:
Utilização:
1
{{ valor|wordcount }}
Saída:
Resultado
Bom…
Código
O código completo desenvolvido nesse projeto está disponível no Github da Python
Academy. Clique aqui para acessá-lo e baixá-lo
(https://github.com/pythonacademybr/HelloWorldDjango)!
Gostou do conteúdo? Compartilha aí!
Para rodar o projeto, execute em seu terminal:
pip install -r
requirements.txt para
instalar
web-com-
python-e-
template)
django-
as dependências.
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
python manage.py makemigrations para criar as Migrações.
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
python manage.py migrate para efetivar as Migrações no banco de dados.
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
python manage.py runserver para executar o servidor de testes do Django.
Conclusão
Ufa… Por hoje é só!
Nesse post vimos como configurar, customizar e estender templates, como utilizar os
filtros e tags do Django, como criar tags e filtros customizados e um pouquinho de
Bootstrap, pra deixar as páginas bonitonas!
Claro que ainda há muito para aprender, mas vimos bastante coisa por aqui…
Ah, quer levar essa série completa de posts para onde for com nosso ebook GRÁTIS?
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
É isso pessoal!
Até a próxima!
Autor
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Que (https://www.linkedin.com/in/vinicius-aramos)
tal um
curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
(mailto:vinicius.ramos@pythonacademy.com.br)
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/
)
(https://github.com/viniciusramos91)
(https://stackoverflow.com/users/6775679/viniciusramos91)
Continue aprendendo!
(/blog/estruturas-condicionais-no-python)
Gostou do conteúdo? Compartilha aí!
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
(/blog/list-comprehensions-no-python)
(/blog/como-instalar-python-no-windows)
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-
Que tal um curso que reúne Programação Python, Projetos Reais e Dicas de Carreira?
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
(/blog/listas-no-python)
Mais
Início (/)
Zen of Python (/zen-of-python)
Blog (/blog/)
Sliders (/sliders/)
Sobre (/sobre)
Loja
(/loja/)
Ebooks
Gostou do conteúdo? Compartilha aí!
QUERO CONHECER
JORNADA PYTHON
( /JORNADA-PYTHON/ )
© 2021 Python Academy
python-e-
template)
django-
text=https://pythonacademy.com.br/blog/d
(https://api.whatsapp.com/send?
web-com-
template&ui=2&tf=1)
view=cm&fs=1&su=A
(https://mail.google.c
web-com-
python-e-
django-