Джанго 2 - Войти Authentication ПРОБЛЕМА: MultiValueDictKeyError для пользователя

голоса
1

Я пытаюсь реализовать в первый раз аутентификации для Django.

Я создаю регистрационную часть после официального гида Джанго 2. Однако я с этой проблемой:

Exception Type: MultiValueDictKeyError Exception Value: 'username'

Я создал приложение под названием «счета». Внутри него, у меня есть следующие:

В счетах / 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)

В шаблоны / 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 %}

В urls.py (из моего приложения «счета» не проекта):

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),
]
Задан 19/09/2018 в 13:33
источник пользователем
На других языках...                            


2 ответов

голоса
1

Просто проверьте метод запроса перед выполнением проверки подлинности, как следующее

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")
Ответил 19/09/2018 в 13:49
источник пользователем

голоса
1

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

Вы получаете сообщение об ошибке , потому что ваш вид всегда пытается получить usernameиз данных POST. Однако, для первоначального запроса GET, request.POSTбудет пустым.

Вы не должны пытаться написать свой собственный вид входа в систему, как это. Django поставляется с видом аутентификации . Вы должны использовать их.

Ответил 19/09/2018 в 13:39
источник пользователем

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