Aula 84 – Loja Online – Atualizar Formulários de Registro e Login
Aula 84 – Loja Online – Atualizar Formulários de Registro e Login
Voltar para página principal do blog
Todas as aulas desse curso
Aula 83 Aula 85
Redes Sociais:
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Melhore seu NETWORKING
https://digitalinnovation.one/
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
E também para me seguir no https://github.com/toticavalcanti.
Código final da aula:
https://github.com/toticavalcanti
Quer aprender python3 de graça e com certificado? Acesse então:
https://workover.com.br/python-codigo-fluente
Canais do Youtube
Toti
Lofi Music Zone Beats
Backing Track / Play-Along
Código Fluente
Putz!
Vocal Techniques and Exercises
PIX para doações
Aula 84 – Loja Online – Atualizar Formulários de Registro e Login
Estamos usando o email para logar, por isso, vamos colocar um label Email.
Vamos mudar também o tipo de campo, vamos trocar para EmailField para ficar de acordo com o que queremos.
Com isso, se você tentar logar com algo que seja diferente de um endereço de email, não irá conseguir.
Para as modificações do RegisterForm, vamos deletar ele, copiar o UserAdminCreationForm e modificar.
As modificações estão em azul.
Veja que o RegisterForm é quase igual ao UserAdminCreationForm.
django_ecommerce/e_commerce/accounts/forms.py
from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import ReadOnlyPasswordHashField
User = get_user_model()
class UserAdminCreationForm(forms.ModelForm):
"""
A form for creating new users. Includes all the required
fields, plus a repeated password.
"""
password = forms.CharField(widget=forms.PasswordInput)
password_2 = forms.CharField(label='Confirm Password', widget=forms.PasswordInput)
class Meta:
model = User
fields = ['email']
def clean(self):
'''
Verify both passwords match.
'''
cleaned_data = super().clean()
password = cleaned_data.get("password")
password_2 = cleaned_data.get("password_2")
if password is not None and password != password_2:
self.add_error("password_2", "Your passwords must match")
return cleaned_data
def save(self, commit=True):
# Save the provided password in hashed format
user = super(UserAdminCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password"])
if commit:
user.save()
return user
class UserAdminChangeForm(forms.ModelForm):
"""A form for updating users. Includes all the fields on
the user, but replaces the password field with admin's
password hash display field.
"""
password = ReadOnlyPasswordHashField()
class Meta:
model = User
fields = ['full_name', 'email', 'password', 'active', 'admin']
def clean_password(self):
# Regardless of what the user provides, return the initial value.
# This is done here, rather than on the field, because the
# field does not have access to the initial value
return self.initial["password"]
class GuestForm(forms.Form):
email = forms.EmailField()
class LoginForm(forms.Form):
username = forms.EmailField(label='Email')
password = forms.CharField(widget=forms.PasswordInput)
class RegisterForm(forms.ModelForm):
"""
A form for creating new users. Includes all the required
fields, plus a repeated password.
"""
password = forms.CharField(widget=forms.PasswordInput)
password_2 = forms.CharField(label='Confirm Password', widget=forms.PasswordInput)
class Meta:
model = User
fields = ['email']
def clean(self):
'''
Verify both passwords match.
'''
cleaned_data = super().clean()
password = cleaned_data.get("password")
password_2 = cleaned_data.get("password_2")
if password is not None and password != password_2:
self.add_error("password_2", "Your passwords must match")
return cleaned_data
def save(self, commit=True):
# Save the provided password in hashed format
user = super(RegisterForm, self).save(commit=False)
user.set_password(self.cleaned_data["password"])
user.active = False # send confirmation email
if commit:
user.save()
return user
Mudança no formulário de registro (RegisterForm)
Antes: O formulário de registro era um formulário personalizado (forms.Form) que definia os campos “username“, “email“, “password” e “password2” manualmente, além de incluir validações personalizadas para garantir que o “username” e o “email” fossem únicos e que as senhas fossem iguais.
Depois: O formulário de registro foi alterado para ser uma classe de ModelForm (forms.ModelForm) em vez de um formulário personalizado. A classe ModelForm é uma subclasse do Django que permite criar formulários diretamente a partir de modelos (neste caso, o modelo “User“). Isso torna o código mais simples e elimina a necessidade de definir os campos manualmente.
Método “clean” do RegisterForm
Antes: O método “clean” do formulário era usado para verificar se as senhas digitadas eram iguais e para verificar se o “username” e o “email” eram únicos no banco de dados.
Depois: O método “clean” foi mantido, mas agora é usado apenas para verificar se as senhas digitadas são iguais. A validação de “username” e “email” foi removida porque o formulário ModelForm já cuida disso automaticamente, usando a validação definida no modelo “User” (por meio dos campos “unique” no modelo).
Método “save” do RegisterForm
Antes: O método “save” era usado para criar um novo usuário no banco de dados usando os dados fornecidos no formulário de registro. O método criava um novo objeto “User” e salvava-o no banco de dados.
Depois: O método “save” foi mantido, mas agora ele foi simplificado para usar o método “save” da classe ModelForm. Dessa forma, o próprio formulário cuida de criar e salvar o novo usuário no banco de dados, aproveitando a funcionalidade já fornecida pelo Django.
django_ecommerce/e_commerce/accounts/views.py
from django.contrib.auth import authenticate, login, logout, get_user_model
from django.http import HttpResponse
from django.shortcuts import render,redirect
from django.utils.http import url_has_allowed_host_and_scheme
from .forms import LoginForm, RegisterForm, GuestForm
from .models import GuestEmail
def guest_register_view(request):
form = GuestForm(request.POST or None)
context = {
"form": form
}
next_ = request.GET.get('next')
next_post = request.POST.get('next')
redirect_path = next_ or next_post or None
if form.is_valid():
email = form.cleaned_data.get("email")
new_guest_email = GuestEmail.objects.create(email=email)
request.session['guest_email_id'] = new_guest_email.id
if url_has_allowed_host_and_scheme(redirect_path, request.get_host()):
return redirect(redirect_path)
else:
return redirect("/register/")
return redirect("/register/")
def login_page(request):
form = LoginForm(request.POST or None)
context = {
"form": form
}
next_ = request.GET.get('next')
next_post = request.POST.get('next')
redirect_path = next_ or next_post or None
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
try:
del request.session['guest_email_id']
except:
pass
if url_has_allowed_host_and_scheme( redirect_path, request.get_host() ):
return redirect( redirect_path )
else:
# 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, "accounts/login.html", context)
def logout_page(request):
context = {
"content": "Você efetuou o logout com sucesso! :)"
}
logout(request)
return render(request, "accounts/logout.html", context)
User = get_user_model()
def register_page(request):
form = RegisterForm(request.POST or None)
context = {
"form": form
}
if form.is_valid():
form.save()
return render(request, "accounts/register.html", context)
As mudanças feitas visam simplificar e melhorar o código, aproveitando ao máximo as funcionalidades já fornecidas pelo Django.
Ao transformar o formulário de registro em uma classe ModelForm, podemos eliminar a necessidade de definir manualmente os campos e suas validações, tornando o código mais limpo e fácil de entender.
Além disso, ao usar o método “save” do ModelForm, podemos aproveitar a funcionalidade interna do Django para criar e salvar o novo usuário no banco de dados, eliminando a necessidade de criar manualmente o objeto “User” e salvá-lo.
Essas mudanças tornam o código mais eficiente, mais legível e menos propenso a erros, facilitando a manutenção do projeto e a adição de novas funcionalidades no futuro.
É sempre uma boa prática aproveitar as funcionalidades fornecidas pelo framework quando possível, para evitar a repetição de código e garantir a consistência e a segurança do sistema.
Próxima aula
Na próxima aula iremos transformar o register_page, login_page e logout_page em view baseada em classe, que é mais flexível e permite a reutilização do código em diferentes partes do projeto além de ser de acordo com a estrutura e convenções do Django, seguindo as melhores práticas do framework.
É isso, até a próxima. 😉
Voltar para página principal do blog
Todas as aulas desse curso
Aula 83 Aula 85
Código final da aula:
https://github.com/toticavalcanti
Canais do Youtube
Toti
Backing Track / Play-Along
Código Fluente
Putz!
Vocal Techniques and Exercises
Dêem um joinha 👍 na página do Código Fluente no
Facebook.
Sigam o Código Fluente no Instagram e no TikTok.
Código Fluente no Pinterest.
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Nos vemos na próxima então, \o/ 😉 Bons Estudos!