2
respostas

[Sugestão] COLOQUEI AS VALIDAÇOES TODAS NO ARQUIVO VIEWS

from django.shortcuts import render
from usuarios.forms import LoginForms
from usuarios.forms import CadastroForms
from django.shortcuts import render, redirect
from django.contrib.auth.models import User 
from django.contrib import auth
from django.contrib import messages

def login(request):
        form = LoginForms()

        if request.method == 'POST':
            form = LoginForms(request.POST)

            if form.is_valid():
                nome=form['nome_login'].value()
                senha=form['senha'].value()


            usuario = auth.authenticate(
               request,
               username=nome,
               password=senha
   )
            
            if usuario is not None:
               auth.login(request, usuario)

            if usuario is not None:
               auth.login(request, usuario)
               messages.success(request, f'{nome} Logado com Sucesso')
               return redirect ('index')

            else:
               messages.error(request, f'Usuário {nome}, não foi possível logar')
               return redirect('login')

        
        return render(request, "usuarios/login.html", {"form": form})  # Este codigo e para mostrar o formulário feito no arquivo form


def cadastro(request):
    form = CadastroForms()

    if request.method == 'POST':
       form = CadastroForms(request.POST)

       if form.is_valid():        
          # Vamos criar variaveis com os dados do formulário
            nome=form['nome_cadastro'].value()
            email=form['email'].value()
            senha=form['senha_1'].value()
            senha_2=form['senha_2'].value()
            

            if User.objects.filter(username=nome).exists(): # verifiando se o usuário ja existe
               messages.error(request, f"Usuário {nome}, já existe!")
               return redirect('cadastro')
            if nome:
               nome = nome.strip()
               if ' ' in nome:
                  messages.error(request, f'Espaços não são permitidos no campo Nome de Cadastro')
                  return redirect('cadastro')
               

            if senha != senha_2:
                  messages.error(request, f'Senhas não são iguais')
                  return redirect('cadastro')
                   

            messages.success(request, f"Usuário {nome} cadastrado com sucesso!!!")            
            usuario = User.objects.create_user(
                username=nome,
                email=email,
                password=senha
            )

            usuario.save()
            return redirect('login')
       

   

    return render(request, 'usuarios/cadastro.html', {'form': form}) # Este codigo e para mostrar o formulário feito no arquivo form

def logout(request):
    auth.logout(request)
    messages.success(request,"Logout efetuado com sucesso")
    return redirect('login')
2 respostas

Olá, Antônio! Pelo que vi no seu código, você fez a autenticação e as validações dos formulários diretamente no arquivo views.py. Isso é totalmente possível e funcional, como você deve ter percebido. No entanto, é importante lembrar que, em termos de boas práticas de programação, é recomendado separar as responsabilidades do seu código.

Nesse sentido, as validações de formulário poderiam ser feitas diretamente no arquivo forms.py. Isso facilitaria a manutenção do código, uma vez que se você precisar alterar algo relacionado às validações, saberá exatamente onde procurar. Além disso, o código ficaria mais organizado e legível.

Para exemplificar, imagine que você queira adicionar uma validação adicional no formulário de login, para verificar se a senha tem pelo menos 8 caracteres. No seu código atual, você teria que ir até o arquivo views.py e adicionar essa lógica lá. No entanto, se as validações estivessem no arquivo forms.py, você poderia simplesmente adicionar essa lógica lá.

Aqui está um exemplo de como você poderia fazer isso:

from django import forms
from django.contrib.auth.models import User

class LoginForms(forms.Form):
    nome_login = forms.CharField(max_length=100)
    senha = forms.CharField(widget=forms.PasswordInput)
    
    def clean(self):
        cleaned_data = super().clean()
        nome = cleaned_data.get('nome_login')
        senha = cleaned_data.get('senha')

        if not User.objects.filter(username=nome).exists():
            raise forms.ValidationError(f"Usuário {nome} não existe.")
        
        if len(senha) < 8:
            raise forms.ValidationError("A senha deve ter pelo menos 8 caracteres.")

Espero ter ajudado e bons estudos!

Olá, Antônio! Pelo que entendi, você colocou todas as validações no arquivo views.py, certo?

De fato, é possível fazer isso, mas não é a prática mais recomendada. Isso porque, ao colocar as validações no arquivo views, você está misturando a lógica de apresentação com a lógica de negócios, o que vai contra o princípio de responsabilidade única e pode tornar seu código mais difícil de manter e testar.

Uma alternativa seria mover as validações para o arquivo forms.py, usando os métodos de validação do Django. Por exemplo, para validar se o nome de usuário já existe, você poderia adicionar um método clean_nome_cadastro() ao seu CadastroForms:

from django.core.exceptions import ValidationError
from django.contrib.auth.models import User 

class CadastroForms(forms.Form):
    # seus campos aqui

    def clean_nome_cadastro(self):
        nome = self.cleaned_data.get('nome_cadastro')
        if User.objects.filter(username=nome).exists():
            raise ValidationError(f"Usuário {nome}, já existe!")
        return nome

Dessa forma, quando você chamar form.is_valid() no seu view, o Django vai automaticamente executar essa validação e adicionar qualquer erro ao formulário. Você pode fazer o mesmo para as outras validações.

Espero ter ajudado e bons estudos!