Django 2 - Inicio de sesión de autenticación PROBLEMA: MultiValueDictKeyError de nombre de usuario

votos
1

Estoy tratando de poner en práctica por primera vez la autenticación de Django.

Estoy creando la parte de inicio de sesión siguiendo la guía oficial de Django 2. Sin embargo estoy teniendo este problema:

Exception Type: MultiValueDictKeyError Exception Value: 'username'

He creado una aplicación llamada cuentas. Dentro de ella, tengo el siguiente:

En cuentas / views.py:

from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout    
def login(request):
      username = request.POST['username']
      password = request.POST['password']
      user = authenticate(request, username=username, password=password)
      if user is not None:
        return redirect('home')
      else:
        return render(request, accounts/login.html)

En las plantillas / accounts.html:

{% extends 'mysite/base.html' %}

{% block content %}

<h1>Login</h1>
<form method=POST action={% url 'login' %}>
{% csrf_token %}
Username:
<br>
<input type=text name=username />
<br>
Password:
<br />
<input type=password name=password />
<br>
<br>
<input class=btn btn-primary type=submit value=Sign Up! />
</form>

{% endblock %}

En urls.py (de mi aplicación cuentas no del proyecto):

from django.urls import path, include
from . import views

urlpatterns = [
    path(signup/, views.signup, name=signup),
    path(login/, views.login, name=login),
    path(logout/, views.logout, name=logout),
]
Publicado el 19/09/2018 a las 13:33
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Sólo tienes que comprobar el método de la petición antes de hacer la autenticación como la siguiente

from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout    
def login(request):
  if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
      return redirect('home')
    else:
      return render(request, "accounts/login.html")
  else:
    return render(request, "accounts/login.html")
Respondida el 19/09/2018 a las 13:49
fuente por usuario

votos
1

def login(request):
    username = request.POST['username']
    ...

Se obtiene el error debido a que su vista siempre intenta usernamea partir de los datos POST. Sin embargo, para la solicitud GET inicial, request.POSTestará vacía.

Usted no debe tratar de escribir su propio punto de vista de inicio de sesión como esta. Django incluye vistas de autenticación . Debe usarlos.

Respondida el 19/09/2018 a las 13:39
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more