Что может вызвать MultiValueDictKeyError в Django? - PullRequest
0 голосов
/ 05 октября 2019

Я почти закончил регистрационную форму, но что-то пошло не так, и я совершенно не знаю, что. Это немного сложно описать, но я постараюсь.

Итак, как вы можете видеть, здесь есть форма входа:

login.html

 <h1>login page</h1>


 <table>
        <tr><a href="register.html">return to register page</a><br> </tr>
        <tr><a href="index.html">return to home page</a> </tr>
    </table>
<br>
<div>
        <form method="post">
            {% csrf_token %}
            <div>
                <div><label>Login/Email </label><input type="text" name="login_name" placeholder="Login/Email"></div>
                <div><label>Password </label><input type="password" name="login_password" placeholder="enter password"></div>
                <div><input type="submit" value="Login"></div>
            </div>
        </form>
    </div>

, а вот форма регистрации: register.html


<h1>Register page</h1>
    <table>
        <tr><a href="login.html">return to login page</a> <br></tr>
        <tr><a href="index.html">return to home page</a> </tr>
    </table>
    <br>
<div>
        <form method="POST">
            {% csrf_token %}
            <div>
                <div><label>Name </label><input type="text" name="registerFrom_name" placeholder="Enter the name"></div>
                <div><label>Surname </label><input type="text" name="registerFrom_surname" placeholder="Enter the surname"></div>
                <div><label>Login/Email </label><input type="text" name="registerFrom_login" placeholder="Login/Email"></div>
                <div><label>Password </label><input type="registerForm_password" name="registerFrom_password" placeholder="Enter password"></div>
                <div><label>Email  </label><input type="text" name="registerForm_email"></div>
                <div><input type="submit" value="Register"> </div>
            </div>
        </form>
    </div>

Используйте свой собственный бэкэнд для обработки froms:

view.html

# BACKEND

from django.shortcuts import render
from django.views import View
from . import ValidateUser, RegisterUser

# Create your views here.

CSRF_COOKIE_SECURE = True


class WebServiceView(View):


    # INDEX - MAIN PAGE
    def indexPage(self, request):
        return render(request, "index.html")

    def register(self, request):

        res = RegisterUser.RegisterUser("user", "user", "login", "test", "emai@email")
        res.createUser()

        return render(request, "register.html")

    def login(self, request):
        print("Login function")
        res = ValidateUser.ValidateUser('/config/dbConfig.ini', '127.0.0.1') # Connection to mysql database
        formParametr = request.POST

        print(formParametr)
        login = formParametr['register_name']
        password = formParametr['register_password']

        res.checkUser(login, password.encode("utf8"))

        return render(request, "login.html")

Проблема возникает, когда я сначала открываю register.html, а затем перехожу на страницу login.html. Джанго бросает MultiValueDictKeyError в /shop/login.html. Я совершенно не понимаю, почему. Как видите, ключ «имя» уже имеет «имя_регистра». Так что может вызвать проблемы?

Ниже полной ошибки:

'register_name'

Request Method:     GET
Request URL:    http://127.0.0.1:8000/shop/login.html
Django Version:     2.2.5
Exception Type:     MultiValueDictKeyError
Exception Value:    

'register_name'

Exception Location:     /usr/local/lib/python3.7/dist-packages/django/utils/datastructures.py in __getitem__, line 80
Python Executable:  /usr/bin/python3.7
Python Version:     3.7.4
Python Path:    

['/home/reg3x/PycharmProjects/lovLevelMusic',
 '/usr/lib/python37.zip',
 '/usr/lib/python3.7',
 '/usr/lib/python3.7/lib-dynload',
 '/usr/local/lib/python3.7/dist-packages',
 '/usr/lib/python3/dist-packages',
 '/usr/lib/python3.7/dist-packages']

1 Ответ

1 голос
/ 05 октября 2019

Это ключевая ошибка. Он говорит вам, что у вас нет ключа для register_name в вашем словаре POST. И это потому, что вы использовали login_name в шаблоне.

Действительно, вы должны использовать для этого формы Django, которые а) позаботятся о выводе полей в шаблоне с правильными именами и б) обеспечатданные были действительны и полностью заполнены до того, как вы получили к ним доступ в представлении.

(В вашем коде есть и другие вещи, которые также меня очень беспокоят. Почему у вас есть login и register методы внутрикласс представления? Это не то, как работают представления на основе классов. И почему ваш URL заканчивается на .html? Это не так, как работают URL-адреса Django. И, самое главное, что такое ValidateUser и RegisterUser? Почему вы подключаетесь? в вашу базу данных явно в каждом представлении? Почему у вас есть эти классы? Это не то, как вы работаете с базой данных в Django. Почему вы делаете это?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...