es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El formulario de inicio de sesión de Django no se está autenticando y redirige a la siguiente URL.

Tengo una aplicación de múltiples usuarios donde intento autenticar al usuario. Si ingreso las credenciales incorrectas, no está mostrando los errores del formulario en su lugar, me redirecciona a la URL de inicio de sesión que se menciona en el archivo settings.py.

forms.py

class LoginForm(forms.Form):
    username = forms.CharField(required=True)
    password = forms.CharField(widget=forms.PasswordInput)

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super().__init__(*args, **kwargs)

    def clean(self):
        username = self.cleaned_data.get("username")
        password = self.cleaned_data.get("password")
        try:
            user = User.objects.get(username=username)
            if user.user_a:
                if user.check_password(password):
                    return self.cleaned_data
                else:
                    self.add_error("password", forms.ValidationError("La contraseña es incorrecta."))
        except models.User.DoesNotExist:
            self.add_error("email", forms.ValidationError("El usuario no existe."))

views.py

class LoginView(FormView):
    template_name = 'login.html'
    form_class = LoginForm
    success_url = reverse_lazy("home")

settings.py

LOGIN_URL = 'index'
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basado en los códigos proporcionados, parece que el problema está en el método clean en forms.py. Se llama al método add_error para agregar errores de formulario para los campos, pero está usando nombres de campo incorrectos.

    En lugar de "password" y "email", debería ser "username" y "__all__" respectivamente. El método clean actualizado en forms.py debería verse así:

    def clean(self):
        username = self.cleaned_data.get("username")
        password = self.cleaned_data.get("password")
        try:
            user = User.objects.get(username=username)
            if user.user_a:
                if user.check_password(password):
                    return self.cleaned_data
                else:
                    self.add_error("__all__", forms.ValidationError("La contraseña es incorrecta."))
        except models.User.DoesNotExist:
            self.add_error("username", forms.ValidationError("El usuario no existe."))
    

    Esto debería agregar los errores de formulario correctos cuando el nombre de usuario o la contraseña sean incorrectos durante la autenticación.

Comments are closed.