Aula 18 – Loja Online – Django – Passando os argumentos com a tag Include
Aula 18 – Loja Online – Django – Passando os argumentos com a tag Include
Django – Passando os argumentos com a tag Include
Voltar para página principal do blog
Todas as aulas desse curso
Aula 17 Aula 19
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Esse é o link do código fluente no Pinterest
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Para baixar o código como está até agora, acesse o link abaixo:
https://github.com/toticavalcanti/django_ecommerce/tree/pass_arguments_with_include
Passando argumentos com a tag Include do Django
Essa aula será apenas para mostrar um pouco mais sobre a tag include django e como ela pode ser útil para coisas repetitivas.
Depois de fazer os teste, iremos voltar o código como tava antes das modificações abaixo, exceto a modificação do src/templates/base.html e no src/templates/base/navbar.html.
Exatamente por essas exceções, optei por criar a branch pass_arguments_with_include, já que no final de tudo o src/templates/base.html e o src/templates/base/navbar.html serão modificados.
Então seguindo!
A variável passada pode ser uma variável de contexto do tipo dicionário, o contexto é passado de qualquer view.
Nós temos alguns dados de contexto e podemos passar esses dados com o include.
Vamos modificar o src/templates/base.html.
src/templates/base.html
{% load static %}
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Base Template</title>
{% include 'base/css.html' %}
{% block base_head %}{% endblock base_head %}
</head>
<body>
{% include 'base/navbar.html' with nome_da_marca='Loja virtual' %}
{% block content %} {% endblock %}
{% include 'base/js.html' %}
</body>
</html>
Agora no src/templates/base/navbar.html vamos usar o context.
src/templates/base/navbar.html
<h1>{{ nome_da_marca }}</h1>
O nome_da_marca tá vindo para view como uma variável de contexto.
Com o servidor rodando acesse:
Dentro da views nós poderíamos ter um outro include, por exemplo, em src/templates/contact/view.html.
src/templates/contacts/view.html
{% extends "base.html" %}
{% block content %}
{% include 'base/navbar.html' with nome_da_marca=brand %}
<div class='text-center'>
<h1>{{ title }}</h1>
</div>
<div class='container'>
<div class='row'>
<div class='col'>
<p>{{ content }}</p>
<div class='col-sm-6 col-12'>
<form method='POST'> {% csrf_token %}
{{ form }}
<button type='submit' class='btn btn-default'>Enviar</button>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
Agora na src/e_commerce/views.py faça a seguinte modificação:
from django.contrib.auth import authenticate, login, get_user_model
from django.http import HttpResponse
from django.shortcuts import render, redirect
from .forms import ContactForm, LoginForm, RegisterForm
def home_page(request):
context = {
"title": "Home Page",
"content": "Bem vindo a Home Page",
}
if request.user.is_authenticated:
context["premium_content"] = "Você é um usuário Premium"
return render(request, "home_page.html", context)
def about_page(request):
context = {
"title": "About Page",
"content": "Bem vindo a About Page"
}
return render(request, "about/view.html", context)
def contact_page(request):
contact_form = ContactForm(request.POST or None)
context = {
"title": "Contact Page",
"content": "Bem vindo a Contact Page",
"form": contact_form,
"brand": "Novo nome da marca"
}
if contact_form.is_valid():
print(contact_form.cleaned_data)
return render(request, "contact/view.html", context)
def login_page(request):
form = LoginForm(request.POST or None)
context = {
"form": form
}
print("User logged in")
print(request.user.is_authenticated)
if form.is_valid():
print(form.cleaned_data)
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(request, username=username, password=password)
print(user)
print(request.user.is_authenticated)
if user is not None:
print(request.user.is_authenticated)
login(request, user)
print("Login válido")
print(request.user.is_authenticated)
# Redireciona para uma página de sucesso.
return redirect("/")
else:
#Retorna uma mensagem de erro de 'invalid login'.
print("Login inválido")
return render(request, "auth/login.html", context)
User = get_user_model()
def register_page(request):
form = RegisterForm(request.POST or None)
context = {
"form": form
}
if form.is_valid():
print(form.cleaned_data)
username = form.cleaned_data.get("username")
email = form.cleaned_data.get("email")
password = form.cleaned_data.get("password")
new_user = User.objects.create_user(username, email, password)
print(new_user)
return render(request, "auth/register.html", context)
Com o servidor rodando acesse:
Veja que aparece duas vezes, isso é porque temos dois includes, um na src/templates/contact/view.html e outro no src/templates/base.html.
O include é muito útil para coisas repetitivas.
Isso foi só um teste pra mostrar um pouco mais como funciona a tag include, mas nós não queremos isso no nosso código, então vamos retirar esses includes que fizemos para testar e deixar o código igual ao que estava antes.
src/templates/contact/view.html
{% extends "base.html" %}
{% block content %}
{% include 'base/navbar.html' %}
<div class='text-center'>
<h1>{{ title }}</h1>
</div>
<div class='container'>
<div class='row'>
<div class='col'>
<p>{{ content }}</p>
<div class='col-sm-6 col-12'>
<form method='POST'> {% csrf_token %}
{{ form }}
<button type='submit' class='btn btn-default'>Enviar</button>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
E em src/e_commerce/views.py remova a variável de contexto brand que a gente criou, deixando o arquivo assim:
from django.contrib.auth import authenticate, login, get_user_model
from django.http import HttpResponse
from django.shortcuts import render, redirect
from .forms import ContactForm, LoginForm, RegisterForm
def home_page(request):
context = {
"title": "Home Page",
"content": "Bem vindo a Home Page",
}
if request.user.is_authenticated:
context["premium_content"] = "Você é um usuário Premium"
return render(request, "home_page.html", context)
def about_page(request):
context = {
"title": "About Page",
"content": "Bem vindo a About Page"
}
return render(request, "about/view.html", context)
def contact_page(request):
contact_form = ContactForm(request.POST or None)
context = {
"title": "Contact Page",
"content": "Bem vindo a Contact Page",
"form": contact_form
}
if contact_form.is_valid():
print(contact_form.cleaned_data)
return render(request, "contact/view.html", context)
def login_page(request):
form = LoginForm(request.POST or None)
context = {
"form": form
}
print("User logged in")
print(request.user.is_authenticated)
if form.is_valid():
print(form.cleaned_data)
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(request, username=username, password=password)
print(user)
print(request.user.is_authenticated)
if user is not None:
print(request.user.is_authenticated)
login(request, user)
print("Login válido")
print(request.user.is_authenticated)
# Redireciona para uma página de sucesso.
return redirect("/")
else:
#Retorna uma mensagem de erro de 'invalid login'.
print("Login inválido")
return render(request, "auth/login.html", context)
User = get_user_model()
def register_page(request):
form = RegisterForm(request.POST or None)
context = {
"form": form
}
if form.is_valid():
print(form.cleaned_data)
username = form.cleaned_data.get("username")
email = form.cleaned_data.get("email")
password = form.cleaned_data.get("password")
new_user = User.objects.create_user(username, email, password)
print(new_user)
return render(request, "auth/register.html", context)
O src/templates/base.html podemos deixar como está, com o <{% include ‘base/navbar.html’ with nome_da_marca = ‘Loja virtual’ %}/h3>
Como foi dito no início, esse é o único arquivo que realmente ficará modificado.
Ficamos por aqui e até a próxima aula.
Aula 17 Aula 19
Todas as aulas desse curso
Voltar para página principal do blog
Para baixar o código como está até agora, acesse o link abaixo:
https://github.com/toticavalcanti/django_ecommerce/tree/pass_arguments_with_include
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Novamente deixo meus link de afiliados:
Hostinger
Digital Ocean
One.com
Obrigado, até a próxima e bons estudos. 😉