Django, Templates e Filtros
Já vimos em Templates do Django que os templates são modelos usados na arquitetura MTV para renderizar as requisições do cliente e gerar texto com marcação HTML. Dentro desses modelos podemos receber variáveis enviadas no contexto, com a marcação {{ var }}
. Um contexto é um conjunto de valores, em um objeto tipo dicionário (um conjunto de chaves:valores), passado pelas views para o template. Os nomes das variáveis são passados como strings.
# se temos a variável
» contexto = {"n1": "um"; "n2":"dois";}
# e o template
⎀ Temos no contexto {{ n1 }} e {{ n2 }}.
# será renderizado como
↳ Temos no contexto um e dois.
Filtros são formas de modificar as saídas de variáveis. Por ex.:
» contexto = {'django': 'o framework web para perfecionistas com prazos'}
⎀ {{ django|title }}
↳ O Framework Web Para Perfecionistas Com Prazos
# ou
» contexto = {'data': '2022-07-04'}
⎀ {{ data|date:"d/m/Y" }}
↳ 04/07/2022
Muitos outros filtros são predefinidos e outros mais podem ser definidos pelo programador.
Filtros do Django
add soma valor ao argumento. Tenta forçar a conversão de strings para numéricos.
» valor = 6
⎀ {{ valor|add:"2" }}
↳ 8
» lista1 = [2,3,4]; lista2 = [7,8,9]
⎀ {{ lista1|add:lista2 }}
↳ [2,3,4,7,8,9]
addslashes, insere “\” em aspas.
» valor = "Einstein disse: 'Não existe mais espaço e tempo'."
⎀ {{ valor|addslashes }}
↳ Einstein disse: \'Não existe mais espaço e tempo\'.
capfirst, capitaliza primeira letra de uma string.
» valor = "não existe mais espaço e tempo"
⎀ {{ valor|capfirst }}
↳ Não existe mais espaço e tempo
center, centraliza texto dentro do espaço dado.
» valor = "tempo"
⎀ {{ valor|center:"20" }}
↳ " tempo "
cut, remove valores do argumento do string dado.
» valor = "não existe mais espaço e tempo"
⎀ {{ valor|cut:" " }}
↳ nãoexistemaisespaçoetempo
cut, formata uma data (e hora) de acordo com especificação dada.
» data = "2022-02-30"
⎀ {{ data|date:"d/m/y" }}
↳ 30/02/22
⎀ {{ data|date:"d-m-Y" }}
↳ 30-02-2022
Alguns formatos são pre-definidos. Veja a lista completa em Django docs.
Caracter |
Descrição |
Exemplo |
Dia |
d |
dia do mes com dois dígitos |
’01’ até ’31’ |
j |
dia do mes sem zeros. |
‘1’ até ’31’ |
D |
dia da semana em texto, 3 letras. |
‘Fri’ |
l |
dia da semana em texto completo. |
‘Friday’ |
w |
dia da semana, numérico. |
‘0’ (Domingo) até ‘6’ (Sábado) |
z |
dia do ano. |
1 to 366 |
Semana |
W |
número da semana no ano. |
1, 53 |
Mês |
m |
mês, 2 dígitos. |
’01’ até ’12’ |
n |
mês sem zeros. |
‘1’ até ’12’ |
M |
mês, texto, 3 letras. |
‘Jan’, ‘Dec’ |
b |
mês, texto, 3 letras, ninúsculas. |
‘jan’, ‘dec’ |
F |
mês, texto, extenso. |
‘January’ |
t |
quantos dias no mês. |
28 to 31 |
Ano |
y |
ano, 2 dígitos. |
’00’ até ’99’ |
Y |
ano, 4 dígitos. |
‘0001’, …, ‘1999’, …, ‘9999’ |
L |
Booleano, se ano é bissexto. |
True ou False |
Hora |
g |
hora, formato 12-hora sem zeros. |
‘1’ até ’12’ |
G |
hora, formato 24-hora sem zeros. |
‘0’ até ’23’ |
h |
hora, formato 12-hora. |
’01’ até ’12’ |
H |
hora, formato 24-hora. |
’00’ até ’23’ |
i |
minutos. |
’00’ até ’59’ |
s |
segundos, 2 dígitos. |
’00’ até ’59’ |
u |
microssegundos. |
000000 até 999999 |
a |
‘a.m.’ ou ‘p.m.’ |
|
A |
‘AM’ ou ‘PM’. |
|
f |
hora, format 12-horas e minutos |
‘1:30’ |
P |
hora, formato 12-hora horas, minutos |
‘a.m.’/’p.m.’ |
Timezone |
e |
nome da timezone |
‘GMT’, ‘-500’, ‘US/Eastern’, etc. |
O formato pode ser um dos predefinidos como DATE_FORMAT, DATETIME_FORMAT, SHORT_DATE_FORMAT ou SHORT_DATETIME_FORMAT ou um formato construído com os especificadores acima. Formatos predefinidos podem depender do ajuste local.
# se data_valor é um objeto datetime, como o resultante de datetime.datetime.now()
# com hora 23:45, dia 01/11/2021
⎀ {{ data_valor|date:"D d M Y" }} {{ data_valor|time:"H:i" }}
↳ Mon 01 Nov 2021 23:45
# se o locale for pt-BR
⎀ {{ data_valor|date:"SHORT_DATE_FORMAT" }}
↳ 01/11/2021
default, fornece valor default se argumento for False.
» valor = ""
⎀ {{ valor|defalt:"nada aqui" }}
↳ nada aqui
default_if_none, fornece valor default se argumento for None.
» valor = None
⎀ {{ valor|defalt_if_none:"recebemos None" }}
↳ recebemos None
dictsort recebe uma lista de dicionários e ordena a lista por alguma das chaves do docionário.
# considerando o dicionário:
» dicio = [
» {'nome': 'Zuenir', 'idade': 9},
» {'nome': 'Antônia', 'idade': 12},
» {'nome': 'Jaime', 'idade': 3},
» ]
⎀ {{ dicio|dictsort:"nome" }}
# resulta em
↳ dicio = [
↳ {'nome': 'Antônia', 'idade': 12},
↳ {'nome': 'Jaime', 'idade': 3},
↳ {'nome': 'Zuenir', 'idade': 9},
↳ ]
Exemplos mais complexos podem ser obtidos:
# se livros é
» livros = [
» {'titulo': '1984', 'autor': {'nome': 'George', 'idade': 45}},
» {'titulo': 'Timequake', 'autor': {'nome': 'Kurt', 'idade': 75}},
» {'titulo': 'Alice', 'autor': {'nome': 'Lewis', 'idade': 33}},
» ]
# o código em template
⎀ {% for livro in livros|dictsort:"autor.idade" %}
⎀ * {{ livro.titulo }} ({{ livro.autor.nome }})
⎀ {% endfor %}
# resultaria em
↳ * Alice (Lewis)
↳ * 1984 (George)
↳ * Timequake (Kurt)
dictsortreversed tem o mesmo efeito que dictsort, mas ordenando em ordem invertida.
divisibleby returna True se o valor é divisível pelo argumento.
» valor = 171
⎀ {{ value|divisibleby:"3" }}
↳ True
escape promove remoção de tags html.
# esse exemplo mostra a exibição final no navegador
» string_html = "<b>Negrito<b>"
⎀ {{ string_html }}
↳ <b>Negrito<b>
⎀ {{ string_html|scape }}
↳ <b>Negrito</b>
escape converte:
<
em <
>
em >
'
(aspas simples) em '
"
(aspas duplas) em "
&
em &
first retorna o 1º elemento de uma lista.
» lista = ["casa","da","sogra"]
⎀ {{ lista|first }}
↳ casa
floatformat promove o arredondamento de números flutuantes.
» valor = 34.23234
⎀ {{ valor|floatformat }}
↳ 34.2
» valor = 34.0000
⎀ {{ valor|floatformat }}
↳ 34
» valor = 34.26000
⎀ {{ valor|floatformat }}
↳ 34.3
O número de casas pode ser definido em valor|floatformat:n. Passando “0” como argumento o arredondamento será para o inteiro mais próximo. O sufixo g introduz separador de milhar, definido em THOUSAND_SEPARATOR.
valor |
template |
output |
34.23234 |
{{ valor|floatformat:2 }} |
34.23 |
34.00000 |
{{ valor|floatformat:2 }} |
34.00 |
34.26000 |
{{ valor|floatformat:2 }} |
34.26 |
34.23234 |
{{ valor|floatformat:”0″ }} |
34 |
31.00000 |
{{ valor|floatformat:”0″ }} |
31 |
39.56000 |
{{ valor|floatformat:”0″ }} |
40 |
34232.34 |
{{ valor|floatformat:”2g” }} |
34,232.34 |
34232.06 |
{{ valor|floatformat:”g” }} |
34,232.1 |
get_digit retorna um inteiro na posição especificada, contando do final para o início. Se não for possível encontar esse dígito, retorna o valor original.
» valor = 9512845
⎀ {{ valor|get_digit:"4" }}
↳ 2
⎀ {{ valor|get_digit:"9" }}
↳ 9512845
join faz a união de elementos em uma lista em uma string (como em str.join(lista)
).
» lista = ["casa", "da", "mãe", "Joana"]
⎀ {{ lista|join:" - " }}
↳ casa - da - mãe - Joana
last retorna o último elemento de uma lista.
» lista = ["casa", "da", "mãe", "Joana"]
⎀ {{ lista|last}}
↳ Joana
len retorna o comprimento de uma lista.
» lista = ["casa", "da", "mãe", "Joana"]
⎀ {{ lista|len}}
↳ 4
length_is retorna booleano, se o comprimento de uma lista é o dado em parâmetro.
» lista = ["casa", "da", "mãe", "Joana"]
⎀ {{ lista|length_is:"4"}}
↳ True
linebreaks substitui quebras de linha em texto puro por uma quebra de linha html (<br>) e insere anova linha entre tags de parágrafo (<p> … </p>).
» texto_puro = "Essa é a linha 1\nEssa é a linha 2"
⎀ {{ texto_puro|linebreaks}}
↳ <p>Essa é a linha 1<br>Essa é a linha 2</p>
linebreaksbr faz a mesma coisa, sem inserir a linha em parágrafo.
linenumbers quebra texto em linhas e as numera.
» lista_compras = '''Leite
» Açucar
» Café
» Pão'''
⎀ {{ lista_compras|linenumbers }}
# resulta em
↳ 1. Leita
↳ 2. Açucar
↳ 3. Café
↳ 4. Pão
Observe que lista_compras = “Leite\nAçucar\nCafé\nPão”.
ljust alinha texto à esquerda dentro de espaço de n caracteres dado.
» comprar = "Pão"
⎀ {{ comprar|ljust:"9" }}
↳ "Pão "
lower converte todas os caracters de uma string para caixa baixa (minúsculas).
» texto = "Pão COM Manteiga"
⎀ {{ texto|lower }}
↳ pão com manteiga
make_list retorna valor string ou inteiro em uma lista.
» texto = "Pão de Queijo"
⎀ {{ texto|make_list }}
↳ ["P", "ã", "o", " ", "d", "e", " ", "Q", "u", "e", "i", "j", "o"]
» numero = 1957
⎀ {{ numero|make_list }}
↳ ["1", "9", "5", "7"]
pluralize retorna sufixo para plurais se valor do parâmetro for maior que 1. Esse valor pode ser o comprimento do objeto. O sufixo default é s
, mas isso pode ser alterado.
» itens_compra = 1
⎀ Você tem que comprar {{ itens_compra }} objeto{{ itens_compra|pluralize }}.
↳ Você tem que comprar 1 objeto.
» itens_compra = 23
⎀ Você tem que comprar {{ itens_compra }} objeto{{ itens_compra|pluralize }}.
↳ Você tem que comprar 23 objetos.
Sufixos alternativos podem ser inseridos como parâmetros:
» quantos = 1
⎀ Você fez o pedido de {{ quantos }} paste{{ quantos|pluralize:"l,is" }}.
↳ Você fez o pedido de 1 pastel.
» quantos = 45
⎀ Você fez o pedido de {{ quantos }} paste{{ quantos|pluralize:"l,is" }}.
↳ Você fez o pedido de 45 pasteis.
random retorna um elemento aleatório de uma lista.
» lista = ["casa", "da", "mãe", "Joana"]
⎀ {{ lista|random }}
# um possível resultado é
↳ mãe
rjust alinha texto à direita dentro de espaço de n caracteres dado.
» comprar = "Pão"
⎀ {{ comprar|rjust:"9" }}
↳ " Pão"
safe marca texto como não necessitando escapes.
escape promove remoção de tags html.
» string_html = "<b>Negrito<b>"
⎀ {{ string_html|escape }}
↳ <b>Negrito<b>
Se existirem tags html elas serão renderizadas no navegador.
slice retorna uma fatia (slice) de uma lista. Usa a mesma sintaxe de slicing de listas do python:
» lista = ["casa","da","sogra", "no", "domingo"]
⎀ {{ lista|slice:":3" }}
↳ ["casa","da","sogra"]
slugify converte texto em ASCII puro, convertendo espaços em hífens. Remove caracteres que não são alfanuméricos, sublinhados (underscores) ou hífens. Converte tudo para minúsculas eliminando espaços nas bordas.
» texto = " Artigo 31 das Notas "
⎀ {{ texto|slugfy }}
↳ artigo-31-das-notas
stringformat formata variável de acordo com o parâmetro especificador.
» valor = 10
⎀ {{ valor|stringformat:"E" }}
↳ 1.000000E+01
Mais caracteres de formatação em printf-style String Formatting.
striptags remove tags [X]Html sempre que possível.
» valor = "<b>Um texto pode ter</b> <button>várias tags</button> <span>(x)html</span>!"
⎀ {{ valor|striptags }}
↳ Um texto pode ter várias tags (x)html!
Observação: striptags não garante que o texto seja seguro. Não aplique a filtro safe sobre o resultado de striptags.
time formata variável tipo time de acordo com formato especificado.
» hora = datetime.datetime.now()
⎀ {{ hora|time:"H:i" }}
↳ 18:49
⎀ {{ hora|time:"H\h i\m" }}
↳ 01h 23m
No exemplo caracteres literais foram escapados (\h, \m).
timesince formata uma diferença de datas entre now (agora) e data fornecida em parâmetro.
# se artigo_gravado contem uma data e
» hora = datetime.datetime.now()
⎀ {{ artigo_gravado|timesince:hora }}
↳ 14 days, 18 hours
timeuntil é análoga à timesince mas retornando a diferença entre uma data data e data futura.
title formata string como título de artigos e livros, colocando em maiúsculas as primeiras letras de cada palavra.
» titulo = "análise auxiliar de enrolação científica"
⎀ {{ titulo|title }}
↳ Análise Auxiliar De Enrolação Científica
truncatechars realiza o truncamento de um texto em um número especificado de caracteres. O texto truncado é seguido de elipses ….
» texto = "Esta é uma nota grande."
⎀ {{ texto|truncatechars:15 }}
↳ Esta é uma nota...
# nada é feito de o texto for menor que o parâmetro de truncamento
⎀ {{ texto|truncatechars:35 }}
↳ Esta é uma nota grande.
truncatechars_html é similar à truncatechars mas evitando o descarte de tags html.
» texto = "Esta é uma nota grande.
"
⎀ {{ texto|truncatechars_html:15 }}
↳ <p>Esta é uma not...</p>
truncatewords trunca uma string após um número dado de palavras. O texto truncado é seguido de elipses …. Quebras de linha são removidas.
» texto = "Um texto com\n muitas palavras pode ser cortado"
⎀ {{ texto|truncatewords:4 }}
↳ Um texto com muitas...
truncatewords_html é similar à truncatewords, mas evitando eliminar tags html. Quebras de linha são mantidas.
» texto = "<p>Um texto com\n muitas palavras pode ser cortado</p>"
⎀ {{ texto|truncatewords:4 }}
↳ <p>Um texto coman muitas...</p>
unordered_list constroi uma lista html à partir de listas e listas aninhadas, inserindo recursivamente sublistas quando necessário.
» lista = ['Estados', ['Minas Gerais', ['Juiz de Fora', 'Belo Horizonte'], 'Paraná']]
⎀ {{ lista|unordered_list }}
↳
<li>Estados
<ul>
<li>Minas Gerais
<ul>
<li>Juiz de Fora</li>
<li>Belo Horizonte</li>
</ul>
</li>
<li>Paraná</li>
</ul>
</li>
Observe que as tags de abertura e fechamento da lista externa (<ul></ul>) não são incluídas.
upper converte todos os caracteres de uma string em maiúsculas.
» texto = "Um texto com algumas palavras."
⎀ {{ texto|upper }}
↳ UM TEXTO COM ALGUMAS PALAVRAS.
urlencode transforma uma string para uso como url.
» url = "https://phylos.net/foo?a=b"
⎀ {{ url|urlencode }}
↳ https%3A//phylos.net/foo%3Fa%3Db
urlize converte uma URL ou endereço de email em links clicáveis.
» url = "Visite minha página em phylos.net"
⎀ {{ url|urlize }}
↳ Visite minha página em phylos.net
# emails também são convertidos
» email = "Mande sua mensagem para usuario@exemplo.com"
⎀ {{ email|urlize }}
↳ Mande sua mensagem para usuario@exemplo.com
O atributo rel=”nofollow” é acrescentado.
urlizetrunc age como urlize mas truncando urls longas para a exibição>
{{ url|urlizetrunc:15 }}
wordcount retorna número de palavras no parâmetro.
» texto = "Um texto com algumas palavras."
⎀ {{ texto|wordcount }}
↳ 5
wordwrap quebra o texto em comprimento especificado, inserindo quebra de linhas. wordwrap:n não quebra palavras mas sim a linha em valores inferiores a n dado como comprimento.
Implements word wrapping by inserting a newline character every n characters. Useful for plain text, but not typically for HTML.
» texto = "Um texto com algumas palavras."
⎀ {{ texto|wordwrap:17 }}
↳ Um texto com
↳ algumas palavras.
yesno retorna uma string especificada para o valor do parâmetro True, False ou None (opcional).
» condicao = False
⎀ {{ condicao|"Sim, Não, Talvez" }}
↳ Não
» condicao = True
⎀ Você respondeu: {{ condicao|"Afirmativo, Negativo" }}
↳ Você respondeu: Afirmativo
Bibliografia
Livros
- Newman, Scott: Django 1.0 Template Development, 2008 Packt, 2008.
Sites
todos acessados em julho de 2022.