Aula 84 – Loja Online – Atualizar Formulários de Registro e Login

Aula 84 – Loja Online – Atualizar Formulários de Registro e Login

Loja Online - Django

Loja Online – Django

Pacote Programador Fullstack

Pacote Programador Fullstack

Voltar para página principal do blog

Todas as aulas desse curso

Aula 83                       Aula 85

Redes Sociais:

facebook

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

PIX Nubank

PIX Nubank


 

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!

 

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>