Resumo : neste tutorial, você aprenderá como criar modelos Django, passar dados de funções de visualização para modelos e exibir os dados nos modelos.
Este tutorial começa onde a criação de um aplicativo Django parou.
Introdução aos templates do Django
No tutorial anterior , você aprendeu como retornar a HttpResponse
com uma h1
tag de uma view. Para retornar uma página HTML completa, você precisará usar um modelo.
Observe que é possível retornar uma página HTML completa misturando o HTML com o código Python. No entanto, não é prático e não se adapta bem.
Um modelo é um arquivo que contém as partes estáticas e dinâmicas de uma página da web. Para gerar as partes dinâmicas da página da web, o Django usa sua linguagem de modelo específica chamada linguagem de modelo Django ou DTL.
O mecanismo de template do Django renderiza templates que contêm variáveis, construções, tags e filtros.
Variáveis
Uma variável é cercada por {{
e }}
. Por exemplo:
Hi {{name}}, welcome back!
Neste modelo, the name
é uma variável. Se o valor da name
variável for John
, o mecanismo de template do Django renderizará o template acima no seguinte texto:
Hi John, welcome back!
Se uma variável for um dicionário , você poderá acessar os itens do dicionário usando a notação de ponto ( dict_name.key
).
Suponha que você tenha um person
dicionário com duas chaves name
e email
:
person = {'name': 'John', 'email': '[email protected]'}
Linguagem de código: JavaScript ( javascript )
… você pode acessar os valores das chaves name
e email
do person
dicionário no modelo assim:
{{ person.name }}
{{ person.email }}
Tag
As tags são responsáveis por gerar conteúdo, servir uma estrutura de controle if-else, for-loop e obter dados de um banco de dados.
As tags são cercadas por {%
e %}
. Por exemplo:
{% csrf_token %}
Neste exemplo, a csrf_token
tag gera um token para prevenir ataques CSRF.
Algumas tags gostam if-else
e for-loop
exigem tags de início e fim. Por exemplo:
{% if user.is_authenticated %}
Hi {{user.username}}
{% endif %}
Linguagem de código: PHP ( php )
Filtros
Os filtros transformam o conteúdo das variáveis e dos argumentos das tags. Por exemplo, para colocar cada palavra de uma string em maiúscula, você usa o title
filtro assim:
{{ name | title }}
Se o valor da name
variável for john doe
, o title
filtro irá transformá-la no seguinte:
John Doe
Alguns filtros aceitam um argumento. Por exemplo, para formatar uma data da joined_date
variável no Y-m-d
formato, você utiliza o seguinte filtro:
{{ joined_date | date: "Y-m-d" }}
Linguagem de código: JavaScript ( javascript )
Aqui estão as tags e filtros de modelo integrados completos .
Comentários
Os comentários ficarão assim:
{# This is a comment in the template #}
Linguagem de código: PHP ( php )
O mecanismo de template do Django não renderizará texto dentro dos blocos de comentários.
Exemplos de modelos Django
Primeiro, crie um novo diretório chamado templates
dentro do blog
diretório:
mkdir templates
Segundo, crie um blog
diretório dentro do templates
diretório:
cd templates
mkdir blog
Observe que o diretório dentro do templates
diretório deve ter o mesmo nome do nome do aplicativo. Neste exemplo, o blog
diretório tem o mesmo nome do blog
app do projeto Django.
Terceiro, dentro do templates/blog
diretório crie dois arquivos de modelo home.html
e about.html
com o seguinte conteúdo.
O home.html
arquivo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Home</title>
</head>
<body>
<h1>Home</h1>
</body>
</html>
Linguagem de código: HTML, XML ( xml )
O about.html
arquivo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>About</title>
</head>
<body>
<h1>About</h1>
</body>
</html>
Linguagem de código: HTML, XML ( xml )
É importante observar que você deve adicionar o blog
aplicativo à INSTALLED_APPS
lista do settings.py
arquivo para que os modelos funcionem. Normalmente, você faz isso imediatamente após criar o novo aplicativo Django .
INSTALLED_APPS = [
# ...
'blog.apps.BlogConfig',
]
Linguagem de código: Python ( python )
Quarto, abra o views.py
arquivo e altere as funções home()
de about()
visualização para o seguinte:
from django.shortcuts import render
def home(request):
return render(request, 'blog/home.html')
def about(request):
return render(request, 'blog/about.html')
Linguagem de código: Python ( python )
Neste views.py
arquivo, importamos a render()
função do arquivo django.shortcuts
.
A render()
função aceita um HttpRequest
objeto e um caminho para um modelo. Ele renderiza o modelo e retorna um HttpResponse
objeto.
Quinto, execute o servidor de desenvolvimento Django:
python manage.py runserver
Linguagem de código: CSS ( css )
Por fim, abra o URL http://127.0.0.1:8000/
e o URL http://127.0.0.1:8000/about/
, você verá páginas HTML completas provenientes dos modelos home.html
e .about.html
Passando variáveis para um modelo
Criaremos dados fictícios de postagem no blog e os passaremos para o home.html
modelo. Posteriormente, você aprenderá como obter os dados de postagem do banco de dados.
Ficará views.py
assim:
from django.shortcuts import render
posts = [
{
'title': 'Beautiful is better than ugly',
'author': 'John Doe',
'content': 'Beautiful is better than ugly',
'published_at': 'October 1, 2022'
},
{
'title': 'Explicit is better than implicit',
'author': 'Jane Doe',
'content': 'Explicit is better than implicit',
'published_at': 'October 1, 2022'
}
]
def home(request):
context = {
'posts': posts
}
return render(request, 'blog/home.html', context)
def about(request):
return render(request, 'blog/about.html')
Linguagem de código: Python ( python )
Como funciona.
- Primeiro, crie uma nova lista (
posts
) que armazene os dados fictícios da postagem. - Segundo, defina um novo dicionário
context
dentro dahome()
função com a chaveposts
e passe-o para arender()
função como terceiro argumento.
Dentro home.html
do template, você pode acessar os dados do post através da posts
variável.
O seguinte home.html
modelo que exibe as postagens:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Blog</title>
</head>
<body>
{% for post in posts %}
<h2>{{ post.title }}</h2>
<small>Published on {{ post.published_at }} by {{ post.author}}</small>
<p>{{ post.content }}</p>
{% endfor %}
</body>
</html>
Linguagem de código: HTML, XML ( xml )
Como funciona.
- Primeiro, use um
for
loop para iterar sobre aposts
variável. Ofor
loop termina comendfor
. Ambosfor
eendfor
estão cercados por{%
e%}
. - Segundo, coloque o valor de cada item no dicionário usando a notação de ponto (
.
).
Se você salvar home.html
e abrir o URL http://127.0.0.1:8000/
, verá os dados da postagem exibidos na página.
Além do for
loop, você pode usar outra instrução condicional como if-else
. Por exemplo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{% if title %} {{title}} {% else %} Blog {% endif %}</title>
</head>
<body>
{% for post in posts %}
<h2>{{ post.title }}</h2>
<small>Published on {{ post.published_at }} by {{ post.author}}</small>
<p>{{ post.content }}</p>
{% endfor %}
</body>
</html>
Linguagem de código: HTML, XML ( xml )
Este exemplo usa uma if-else
instrução para mostrar a title
variável se ela está disponível ou Blog
não.
Para passar a title
variável para o home.html
modelo, você adiciona uma nova entrada ao context
dicionário com a chave title
na home()
função como esta:
def home(request):
context = {
'posts': posts,
'title': 'Zen of Python'
}
return render(request, 'blog/home.html', context)
Linguagem de código: Python ( python )
Se você atualizar o URL inicial http://127.0.0.1:8000/
, verá o novo título.
Normalmente, um site tem algumas seções comuns, como cabeçalho, rodapé e barra lateral. Para evitar repeti-los em todos os modelos, você pode usar um modelo base.
Criando um modelo base
Primeiro, crie um novo templates
diretório no diretório do projeto (não no blog
aplicativo):
├── blog
├── db.sqlite3
├── django_project
├── manage.py
├── templates
└── users
Linguagem de código: texto simples ( texto simples )
A seguir, adicione o diretório do template à TEMPLATES
opção no settings.py
arquivo do projeto:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates' ],
'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',
],
},
},
]
Linguagem de código: Python ( python )
Observe que BASE_DIR
é um Path
objeto que vem do pathlib
módulo integrado. A barra /
é um operador que concatena o BASE_DIR
objeto com a 'templates'
string. Esse recurso é chamado de sobrecarga de operador em Python.
Em seguida, crie base.html
no templates
diretório com o seguinte código:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>{% if title %} {{title}} {% else %} Blog {% endif %}</title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
Linguagem de código: HTML, XML ( xml )
O base.html
é servido como modelo base para outros modelos. O nome do modelo base pode ser qualquer coisa como main.html
.
Depois disso, altere o home.html
template dentro do templates/blog
diretório da seguinte forma:
{% extends 'base.html' %}
{% block content %}
<h1>My Posts</h1>
{% for post in posts%}
<h2>{{ post.title }}</h2>
<small>Published on {{ post.published_at }} by {{ post.author}}</small>
<p>{{ post.content }}</p>
{% endfor%}
{% endblock %}
Linguagem de código: HTML, XML ( xml )
Estende home.html
o base.html
modelo usando a extends
tag. O home.html
template possui sua seção para o content
bloco.
Além disso, altere o about.html
modelo que estende o base.html
modelo:
{% extends 'base.html' %}
{% block content %}
<h1>About</h1>
{% endblock content %}
Linguagem de código: HTML, XML ( xml )
Finalmente, reinicie o servidor de desenvolvimento Django e abra URL http://127.0.0.1:8000/
e você verá as mudanças.
Configurar arquivos estáticos
Os arquivos estáticos são arquivos CSS, JavaScript e de imagem que você usa nos modelos. Para usar os arquivos estáticos nos modelos, siga estas etapas:
Primeiro, crie um static
diretório dentro do diretório do projeto:
mkdir static
Linguagem de código: JavaScript ( javascript )
O diretório do projeto ficará assim:
├── blog
├── db.sqlite3
├── manage.py
├── mysite
├── static
└── templates
Linguagem de código: CSS ( css )
Segundo, defina o STATICFILES_DIRS
após settings.py
o STATIC_URL
arquivo para que o Django possa encontrar os arquivos estáticos no diretório estático:
STATIC_URL = 'static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
Linguagem de código: Python ( python )
Terceiro, crie três diretórios js
, css
e images
diretório dentro do static
diretório:
├── static
| ├── css
| ├── images
| └── js
Linguagem de código: texto simples ( texto simples )
Quarto, crie style.css
dentro do diretório CSS com o seguinte conteúdo.
h1{
color:#0052EA
}
form {
max-width: 400px;
}
label, input, textarea, select{
display:block;
width:100%;
}
input[type="submit"]{
display:inline-block;
width:auto;
}
.errorlist {
padding:0;
margin:0;
}
.errorlist li{
color:red;
list-style:none;
}
.alert{
padding:0.5rem;
}
.alert-success{
background-color: #dfd
}
.alert-error{
background-color:#ba2121;
color:#fff;
}
Linguagem de código: CSS ( css )
Observe que usamos apenas algumas regras CSS simples para facilitar o acompanhamento dos tutoriais. Nosso foco principal é Django, não CSS ou JavaScript.
Quinto, crie o app.js
interior do js
diretório com o seguinte código:
setTimeout(() => {
alert('Welcome to my site!');
}, 3000);
Linguagem de código: JavaScript ( javascript )
Este código mostra um alerta após o carregamento da página por 3 segundos .
Sexto, edite o base.html
modelo para carregar os arquivos style.css
e app.js
:
{%load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="{% static 'css/style.css' %}" />
<script src="{% static 'js/app.js' %}" defer></script>
<title>My Site</title>
</head>
<body>
{%block content%}
{%endblock content%}
</body>
</html>
Linguagem de código: HTML, XML ( xml )
Sétimo, reinicie o servidor de desenvolvimento Django, abra a URL http://127.0.0.1:8000/
e você verá que a cor do título muda de acordo com a regra CSS.
Além disso, você verá um alerta após cerca de 3 segundos porque o JavaScript
código é app.js
executado:
Como não estamos focando na parte JavaScript, você pode remover o código do app.js
arquivo para continuar no próximo tutorial.
Baixe o código fonte do Projeto Django
Resumo
- Um modelo Django contém partes estáticas e dinâmicas de uma página web.
- Django usa Django Template Language (DTL) por padrão para criar modelos.
- Use
{{ variable_name }}
para exibir o valor devariable_name
em um modelo. - Use
{% control_tag %}
para incluir uma tag de controle em um modelo. - Use a
static
tag para carregar os arquivos estáticos, incluindo CSS, JavaScript e imagens.