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
- Django Project: Django, web framework for perfectionists with deadlines,
- Django Project: Templates,
- Django Project: Builtins Templates and Tags,
todos acessados em julho de 2022.