1
resposta

[Dúvida] login não funciona para usuarios criados no site

o site do alura space consegue criar um usuário mas esse usuário q foi criado não consegue fazer login" o indicativo q o usuário conseguiu o login, e ele ser redirecionado para a pagina inicial caso o login não seja efetuado ele continua na pagina de login"

esse e meu codigo:

form.py

from django import forms


class LoginForms(forms.Form):
    nome_login = forms.CharField(
        label="Nome de Login",
        required=True,
        max_length=100,
        widget=forms.TextInput(
            attrs={"class": "form-control", "placeholder": "Ex.: Ademario Sousa"}
        ),
    )

    senha = forms.CharField(
        label="Senha",
        required=True,
        max_length=70,
        widget=forms.PasswordInput(
            attrs={"class": "form-control", "placeholder": "Digite sua senha"}
        ),
    )


class CadastroForms(forms.Form):
    nome_cadastro = forms.CharField(
        label="Nome de Cadastro",
        required=True,
        max_length=100,
        widget=forms.TextInput(
            attrs={"class": "form-control", "placeholder": "Ex.: Ademario Sousa"}
        ),
    )

    email = forms.EmailField(
        label="Email",
        required=True,
        max_length=100,
        widget=forms.EmailInput(
            attrs={
                "class": "form-control",
                "placeholder": "Ex.: ademariosousa@gmail.com",
            }
        ),
    )

    senha_1 = forms.CharField(
        label="Senha",
        required=True,
        max_length=70,
        widget=forms.PasswordInput(
            attrs={"class": "form-control", "placeholder": "Digite sua senha"}
        ),
    )

    senha_2 = forms.CharField(
        label="Confirme sua Senha",
        required=True,
        max_length=70,
        widget=forms.PasswordInput(
            attrs={"class": "form-control", "placeholder": "Digite sua senha novamente"}
        ),
    )

views.py

from django.shortcuts import render, redirect

from usuarios.forms import LoginForms, CadastroForms

from django.contrib.auth.models import User

from django.contrib import auth


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)
            return redirect('index')
        else:
            return redirect("login")


    return render(request, "usuarios/login.html", {"form": form})


def cadastro(request):
    form = CadastroForms()

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

    if form.is_valid():
        if form["senha_1"].value() != form["senha_2"].value():
            return redirect("cadastro")

        nome = form["nome_cadastro"].value()
        email = form["email"].value()
        senha = form["senha_1"].value()

        if User.objects.filter(username=nome).exists():
            return redirect("cadastro")
        usuario = User.objects.create(username=nome, email=email, password=senha)
        usuario.save()
        return redirect("login")
    return render(request, "usuarios/cadastro.html", {"form": form})
1 resposta

Olá Victor, tudo bem?

Pelo que eu entendi, você está conseguindo criar o usuário, mas ao tentar fazer o login, ele não é redirecionado para a página inicial, correto?

Analisando o seu código, parece que o problema está na forma como você está criando o usuário. No Django, quando criamos um novo usuário, não devemos usar o método User.objects.create(), pois ele não vai encriptar a senha do usuário, e sim, armazená-la como um texto simples. Quando você tenta autenticar o usuário, o Django não consegue fazer a correspondência entre a senha fornecida e a senha no banco de dados, pois a senha no banco de dados não está encriptada.

Então, em vez de usar User.objects.create(), você deve usar o método User.objects.create_user(). Este método vai cuidar da encriptação da senha para você.

Aqui está como você deve alterar a função de cadastro:

def cadastro(request):
    form = CadastroForms()

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

    if form.is_valid():
        if form["senha_1"].value() != form["senha_2"].value():
            return redirect("cadastro")

        nome = form["nome_cadastro"].value()
        email = form["email"].value()
        senha = form["senha_1"].value()

        if User.objects.filter(username=nome).exists():
            return redirect("cadastro")
        usuario = User.objects.create_user(username=nome, email=email, password=senha)
        usuario.save()
        return redirect("login")
    return render(request, "usuarios/cadastro.html", {"form": form})

Lembrando que é apenas uma sugestão. Qualquer coisa manda aqui de novo.

Espero ter ajudado e bons estudos!