Aula 05 - Loja Online - Ecommerce - Django - Login - Register

Loja Virtual - Ecommerce - Django - Login - Register

Como criar uma página de login e registro de usuário no django?

Para baixar o código como está até agora, acesse o link abaixo: https://github.com/toticavalcanti/django_ecommerce/tree/login_register_forms

Curta a página do Código Fluente no Facebook https://www.facebook.com/Codigofluente-338485370069035/

Vou deixar meu link de referidos na digitalocean pra vocês.

Quem se cadastrar por esse link, ganha $100.00 dólares de crédito na digitalocean:

Digital Ocean

Esse outro link é da one.com:

One.com

Formulário de login e registro de usuário

Modifique o src/e_commerce/forms.py, para criar a classe LoginForm e RegisterForm. E também, faça o import do get_user_model.
from django import forms
from django.contrib.auth import get_user_model

User = get_user_model()
class ContactForm(forms.Form):
    full_name = forms.CharField(
        widget=forms.TextInput(
            attrs={
                    "class": "form-control", 
                    "placeholder": "Seu nome completo"
                }
            )
        )
    email     = forms.EmailField(
        widget=forms.EmailInput(
            attrs={
                    "class": "form-control", 
                    "placeholder": "Digite seu email"
                }
            )
        )
    content   = forms.CharField(
        widget=forms.Textarea(
            attrs={
                    "class": "form-control", 
                    "placeholder": "Digite sua mensagem"
                }
            )
        )
    
    def clean_email(self):
        email = self.cleaned_data.get("email")
        if not "gmail.com" in email:
            raise forms.ValidationError("O Email deve ser do gmail.com")
        return email

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

class RegisterForm(forms.Form):
    username = forms.CharField()
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput)
    password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput)

    def clean_username(self):
        username = self.cleaned_data.get('username')
        qs = User.objects.filter(username=username)
        if qs.exists():
            raise forms.ValidationError("Esse usuário já existe, escolha outro nome.")
        return username
    
    def clean_email(self):
        email = self.cleaned_data.get('email')
        qs = User.objects.filter(email=email)
        if qs.exists():
            raise forms.ValidationError("Esse email já existe, tente outro!")
        return email

    def clean(self):
        data = self.cleaned_data
        password = self.cleaned_data.get('password')
        password2 = self.cleaned_data.get('password2')
        if password != password2:
            raise forms.ValidationError("As senhas informadas devem ser iguais!")
        return data
 

Importe das classes

Agora em src/e_commerce/views.py, importe a classe ContactFormLoginFormRegisterForm, importe também authenticate, login, get_user_model e redirect do django, e crie os métodos login_page e register_page.

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")
            # 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)

get_user_model

O get_user_model serve para retornar o model de user ativo no momento. O Django tem duas funções no django.contrib.auth:
  • authenticate()
  • login()

authenticate

O authenticate() é para autenticar o username e senha.

login

O login() e para logar um usuário. Em uma view ele recebe um objeto HttpRequest e um User. A função login() salva o ID do usuário na sessão usando o framework de sessão do Django. Quando você está logando um usuário, você deve chamar authenticate() antes de chamar login(). A função authenticate() seta um atributo sobre o User observando que o backend de autenticação, autenticou o usuário com sucesso Ele recebe dois argumentos: username e password e retorna um objeto User se a senha for válida para este username None e a senha for inválida.

cleaned_data

O cleaned_data é um dicionário com os dados limpos do formulário, ele retorna esses dados limpos. Cada campo em uma classe Form é responsável não apenas pela validação de dados, mas também por “limpá-lo”, normalizando-o para um formato consistente. Esse é um recurso interessante porque permite que os dados de um determinado campo sejam inseridos de várias maneiras, sempre resultando em resultados consistentes. Por exemplo, DateField normaliza a entrada em um objeto datetime.date do Python, independentemente de você passar uma string no formato '2018-07-15', um objeto datetime.date ou vários outros formatos, DateField sempre o normalizará para um objeto datetime.date, desde que seja válido. Depois de criar uma instância de formulário com um conjunto de dados e validá-la, você pode acessar os dados limpos por meio do atributo cleaned_data. Agora vamos criar src/template/auth/login.html

<form method='POST'> 
    {% csrf_token %}
    {{ form }}
    <button type='submit' class='btn btn-default'>Enviar</button>
</form>
E o src/template/auth/register.html

<form method='POST'> 
    {% csrf_token %}
    {{ form }}
    <button type='submit' class='btn btn-default'>Enviar</button>
</form>
Vamos fazer as migrações para o banco python manage.py makemigrations python manage.py migrate Agora crie um super usuário python manage.py createsuperuser Escolha um nome e uma senha para esse usuário. Vamos importar login_page, register_page no src/e_commerce/urls.py e adicionar no urlpatterns.

from django.contrib import admin
from django.urls import path

from .views import home_page, about_page, contact_page, login_page, register_page

urlpatterns = [
	path('', home_page),
	path('about/', about_page),
	path('contact/', contact_page),
    path('login/', login_page),
    path('register/', register_page),
	path('admin/', admin.site.urls),
]
Vamos mudar nossa home page para ter um conteúdo premium, para os usuários registrados. Em src/template/home_page.html coloque o conteúdo abaixo.

<!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">

        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
    </head>
    <body>
        <div class='text-center'>
            <h1>{{ title }}</h1>
            <p>{{ content }}</p>
        </div>
        <div class='container'>
            {% if request.user.is_authenticated %}
            <div class='row'>
                <div class='col'>
                    <h1>Premium</h1>
                    <p>{{ premium_content }}</p>
                </div>
            </div>
            {% endif %}
        </div>

        <!-- Optional JavaScript -->
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
    </body>
</html>

É isso, valeu, até! ;)

Curta a página do Código Fluente no Facebook https://www.facebook.com/Codigofluente-338485370069035/

Vou deixar meu link de referidos na digitalocean pra vocês.

Quem se cadastrar por esse link, ganha $100.00 dólares de crédito na digitalocean:

Digital Ocean

Esse outro link é da one.com:

One.com

Para baixar o código como está até agora, acesse o link abaixo: https://github.com/toticavalcanti/django_ecommerce/tree/login_register_forms

Obrigado, até a próxima e bons estudos. ;)