Aula 05 – Loja Online – Ecommerce – Django – Login – Register toticavalcantiAula 05 – Loja Online – Ecommerce – Django – Login – RegisterLoja Virtual – Ecommerce – Django – Login – RegisterComo criar uma página de login e registro de usuário no django?Formulário de login e registro de usuárioVoltar para página principal do blogTodas as aulas desse cursoAula 04 Aula 06Para baixar o código como está até agora, acesse o link abaixo: https://github.com/toticavalcanti/django_ecommerce/tree/login_register_formsCurta 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 OceanEsse outro link é da one.com:One.comFormulário de login e registro de usuárioModifique 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 classesAgora em src/e_commerce/views.py, importe a classe ContactForm, LoginForm, RegisterForm, 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_modelO 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()authenticateO authenticate() é para autenticar o username e senha.loginO 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 sucessoEle recebe dois argumentos: username e password e retorna um objeto User se a senha for válida para este username e None e a senha for inválida.cleaned_dataO 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 bancopython manage.py makemigrations python manage.py migrateAgora crie um super usuáriopython manage.py createsuperuserEscolha 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> Aula 04 Aula 06Todas as aulas desse cursoVoltar para página principal do blogÉ 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 OceanEsse outro link é da one.com:One.comPara baixar o código como está até agora, acesse o link abaixo: https://github.com/toticavalcanti/django_ecommerce/tree/login_register_formsObrigado, até a próxima e bons estudos. 😉Category: Django, Loja virtual - Ecommerce, Programação Web