【问题标题】:What can cause MultiValueDictKeyError in Django?什么会导致 Django 中的 MultiValueDictKeyError?
【发布时间】:2020-02-03 15:17:04
【问题描述】:

我几乎完成了我的注册表单,但出了点问题,我完全不知道是什么。这有点难以描述,但我会尝试。

所以,你可以看到这里是登录表单:

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>

这是注册表: 注册.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 页面时,问题就出现了。 Django 在 /shop/login.html 处抛出 MultiValueDictKeyError。我完全不明白为什么。如您所见,键“name”已经具有“register_name”。那么什么会导致问题呢?

低于完整错误:

'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']

【问题讨论】:

    标签: django forms post request


    【解决方案1】:

    这是一个 KeyError。它告诉您,您的 POST 字典中没有 register_name 的密钥。那是因为您在模板中使用了login_name

    确实,您应该为此使用 Django 表单,这将 a) 负责以正确的名称输出模板中的字段,并且 b) 在您在视图中访问数据之前确保数据有效且已完全填充。

    (您的代码中还有其他一些内容也让我非常担心。为什么在视图类中有 loginregister 方法?这不是基于类的视图的工作方式。为什么你的 URL以 .html 结尾?这不是 Django URL 的工作方式。而且,最重要的是,ValidateUserRegisterUser 是什么?为什么要在每个视图中显式连接到数据库?为什么要有这些类?那不是你是如何在 Django 中使用数据库的。你为什么要这样做?)

    【讨论】:

    • 你好 Daniel,我是 Django 新手,但在我用 Flask 编写一些小应用程序之前。为什么在视图类中有登录和注册方法? - 老实说,我不知道 :( 你能告诉我我应该如何使用数据库吗?
    • 我有创建网站的经典方式,这就是为什么我将 .html 放入 URL(只是关于架构的小知识)。我使用另一种方式连接数据库,因为我有一些有线错误,所以我决定使用更快的 PyMysql,但我会改变它。我只是不想在开始时阻止自己:)
    • 您应该以正确的方式做事开始。阅读教程,了解数据模型以及基于类的视图的工作原理。
    猜你喜欢
    • 2011-09-16
    • 2014-06-25
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多