Django 2 - Connexion d'authentification PROBLÈME: MultiValueDictKeyError pour nom d'utilisateur

voix
1

Je suis en train de mettre en œuvre pour la première fois l'authentification de Django.

Je crée la partie de connexion suivant le guide officiel de Django 2. Cependant, j'ai ce problème:

Exception Type: MultiValueDictKeyError Exception Value: 'username'

J'ai créé une application appelée « comptes ». A l'intérieur de celui-ci, je donne les résultats suivants:

Dans les comptes / 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)

Dans les modèles / 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 %}

Dans urls.py (de mon application « comptes » pas du projet):

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),
]
Créé 19/09/2018 à 13:33
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Il suffit de cocher la méthode de requête avant de faire l'authentification comme suit

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")
Créé 19/09/2018 à 13:49
source utilisateur

voix
1

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

Vous obtenez l'erreur parce que votre vue toujours tente d'obtenir usernamedes données POST. Cependant, pour la demande GET initiale, request.POSTsera vide.

Vous ne devriez pas essayer d'écrire votre propre point de vue de connexion comme celui - ci. Django est livré avec des vues d'authentification . Vous devez les utiliser.

Créé 19/09/2018 à 13:39
source utilisateur

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