Django - Sistema de Modelos
Django torna possível separar python e HTML, o python vai em views e HTML vai em templates. Para ligar os dois, Django conta com a função render e a linguagem Django Template.
A Função Render
Esta função leva três parâmetros -
Request - O pedido inicial.
The path to the template - Este é o caminho relativo à opção TEMPLATE_DIRS nas variáveis settings.py do projeto.
Dictionary of parameters- Um dicionário que contém todas as variáveis necessárias no modelo. Esta variável pode ser criada ou você pode usar locals () para passar todas as variáveis locais declaradas na visão.
Django Template Language (DTL)
O mecanismo de template do Django oferece uma minilinguagem para definir a camada voltada para o usuário do aplicativo.
Exibindo Variáveis
Uma variável se parece com isto: {{variable}}. O modelo substitui a variável pela variável enviada pela visão no terceiro parâmetro da função de renderização. Vamos alterar nosso hello.html para exibir a data de hoje -
hello.html
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
</body>
</html>
Então nossa visão mudará para -
def hello(request):
today = datetime.datetime.now().date()
return render(request, "hello.html", {"today" : today})
Agora obteremos a seguinte saída após acessar a URL / myapp / hello -
Hello World!!!
Today is Sept. 11, 2015
Como você provavelmente notou, se a variável não for uma string, o Django usará o método __str__ para exibi-la; e com o mesmo princípio, você pode acessar um atributo de objeto exatamente como faz no Python. Por exemplo: se quiséssemos exibir o ano da data, minha variável seria: {{hoje.ano}}.
Filtros
Eles ajudam a modificar as variáveis no momento da exibição. A estrutura dos filtros se parece com o seguinte: {{var | filtros}}.
Some examples -
{{string|truncatewords:80}} - Este filtro truncará a string, de forma que você verá apenas as primeiras 80 palavras.
{{string|lower}} - Converte a string em minúsculas.
{{string|escape|linebreaks}} - Escapa o conteúdo da string e depois converte as quebras de linha em tags.
Você também pode definir o padrão para uma variável.
Tag
Tags permitem que você execute as seguintes operações: if condition, for loop, herança de template e muito mais.
Marque se
Assim como no Python, você pode usar if, else e elif em seu modelo -
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
</body>
</html>
Neste novo template, dependendo da data do dia, o template irá renderizar um determinado valor.
Tag para
Assim como 'if', temos a tag 'for', que funciona exatamente como no Python. Vamos mudar nossa visão hello para transmitir uma lista ao nosso template -
def hello(request):
today = datetime.datetime.now().date()
daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})
O modelo para exibir essa lista usando {{for}} -
<html>
<body>
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
{% for day in days_of_week %}
{{day}}
</p>
{% endfor %}
</body>
</html>
E devemos obter algo como -
Hello World!!!
Today is Sept. 11, 2015
We are I don't know.
Mon
Tue
Wed
Thu
Fri
Sat
Sun
Bloquear e estender tags
Um sistema de template não pode ser completo sem herança de template. Ou seja, quando você está projetando seus modelos, você deve ter um modelo principal com buracos que o modelo da criança preencherá de acordo com sua própria necessidade, como uma página pode precisar de um css especial para a guia selecionada.
Vamos alterar o modelo hello.html para herdar de um main_template.html.
main_template.html
<html>
<head>
<title>
{% block title %}Page Title{% endblock %}
</title>
</head>
<body>
{% block content %}
Body content
{% endblock %}
</body>
</html>
hello.html
{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}
Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}
the first day of month.
{% elif today.day == 30 %}
the last day of month.
{% else %}
I don't know.
{%endif%}
<p>
{% for day in days_of_week %}
{{day}}
</p>
{% endfor %}
{% endblock %}
No exemplo acima, ao chamar / myapp / hello, ainda obteremos o mesmo resultado de antes, mas agora contamos com extends e block para refatorar nosso código -
No main_template.html, definimos blocos usando o bloco de tags. O bloco de título conterá o título da página e o bloco de conteúdo terá o conteúdo principal da página. Em home.html, usamos extends para herdar do main_template.html, então preenchemos o bloco definido acima (conteúdo e título).
Tag de comentário
A tag de comentário ajuda a definir comentários em modelos, não comentários HTML, eles não aparecerão na página HTML. Pode ser útil para documentação ou apenas para comentar uma linha de código.