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

Loja Online - Django - Passando os argumentos com a tag Include

Loja Online – 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:

127.0.0.1:8000/contact/

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:

127.0.0.1:8000/contact/

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. 😉

 

About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>