Directamente al grano, soy nuevo en Python y quiero probar un inicio de sesión personalizado en django. Más específicamente, quiero procesar algunos datos del formulario antes de iniciar sesión.

Salí a esto:

class mylogin(auth_views.LoginView):
    def form_valid(self, form):
        print("datas :D!", form.cleaned_data['password'])
        super().form_valid(form)

Todas las demás cosas deben seguir siendo las de LoginView. Entonces, en mi urls.py tengo:

path('login/', views.mylogin.as_view(template_name='public/login.html'), name='login'),

Y el resultado, cuando intento iniciar sesión es:

AttributeError: 'NoneType' object has no attribute 'has_header'

Esto tiene más que ver con algún tipo de objeto de respuesta. Precisamente:

django\lib\site-packages\django\utils\cache.py in patch_response_headers, line 243

Django está en la versión 2.1.2.

¡Gracias por todo el pescado!

2
gaamda 16 oct. 2018 a las 14:12

2 respuestas

La mejor respuesta

FormMixin.form_valid [Django-doc] se supone que la función devolver un objeto HttpResponse en caso de que el formulario sea válido.

Aquí invoca la función super().form_valid(form), pero no devuelve la HttpResponse que genera, por lo que debe agregar una instrucción return:

class mylogin(auth_views.LoginView):

    def form_valid(self, form):
        print("datas :D!", form.cleaned_data['password'])
        return super().form_valid(form)

Por supuesto, también puede decidir construir un HttpResponse en su función form_valid, o por ejemplo, primero "postprocesar" la respuesta antes de devolverla, pero independientemente, el contrato es ese form_valid debería devolver un HttpResponse.

1
Willem Van Onsem 16 oct. 2018 a las 11:16

Debes devolver el resultado de llamar a super.

return super().form_valid(form)
1
Daniel Roseman 16 oct. 2018 a las 11:13