Aula 05 – Loja Online – Ecommerce – Django – Login – Register
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?

Formulário de login e registro de usuário
Voltar para página principal do blog
Todas as aulas desse curso
Aula 04 Aula 06
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 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_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 e 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>