/ account / register处的MultiValueDictKeyError

时间:2020-05-06 17:32:26

标签: python django django-forms django-views web-development-server

错误: / account / register处的MultiValueDictKeyError '名字' 请求方法:POST 要求网址:http://127.0.0.1:8000/account/register Django版本:2.2.7 异常类型:MultiValueDictKeyError 异常值:
'名字' 异常位置: getitem 中的C:\ Users \ Maansi \ AppData \ Roaming \ Python \ Python37 \ site-packages \ django \ utils \ datastructures.py,第80行 views.py:

 def login(request):
    if request.method=='POST':
        username=request.POST['username']
        password=request.POST['password']
        user=auth.authenticate(username=username,password=password)
        if user is not None:
            auth.login(request,user)
            return redirect("/")
        else:
            messages.info(request,'invalid credentials')
            return redirect('login')
    else:
        return render(request,"login.html")

def register(request):
    if request.method=='POST':
        first_name=request.POST['first_name']
        last_name=request.POST['last_name']
        username=request.POST['username']
        password1=request.POST['password1']
        password2=request.POST['password2']
        email=request.POST['email']
        if password1==password2:
            if User.objects.filter(email=email).exists():
                messages.info(request,'Email Taken')
                return redirect('register')
            elif User.objects.filter(username=username).exists():
                messages.info(request,'Username Taken')
                return redirect('register')
            else:    
             user=User.objects.create_user(username=username,password=password1,email=email,first_name=first_name,last_name=last_name)
                user.save()
                print('user created')
                return redirect('login')
        else:
            messages.info(request,"Password don't match!")
            return redirect('register')
    else:
        return render(request,"register.html")

login.html

                        <div class="col-sm-6">
                            <div class="form-group">
                                {% csrf_token %}
                                <input class="form-control valid" name="username" id="name" type="text" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Enter your username'" placeholder="Enter your username">
                            </div>
                        </div>
                        <div class="col-sm-6">
                            <div class="form-group">
                                {% csrf_token %}
                                <input class="form-control valid" name="password" id="password" type="password" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Enter Password'" placeholder="Enter Password">
                            </div>
                        </div>

register.html:

<div class="col-lg-8">
                        {% csrf_token %}
                        <form class="form-contact contact_form" action="register" method="post">
                            <div class="row">

                                <div class="col-sm-6">
                                    <div class="form-group">
                                        {% csrf_token %}
                                        <input class="form-control valid" name="first_name" id="name" type="text" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Enter your name'" placeholder="Enter your name">
                                    </div>
                                </div>
                                <div class="col-sm-6">
                                    <div class="form-group">
                                        {% csrf_token %}
                                        <input class="form-control valid" name="last_name" id="name" type="text" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Enter your last name'" placeholder="Enter your last name">
                                    </div>
                                </div>
                                <div class="col-sm-6">
                                    <div class="form-group">
                                        {% csrf_token %}
                                        <input class="form-control valid" name="username" id="name" type="text" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Enter your username'" placeholder="Enter your username">
                                    </div>
                                </div>
                                <div class="col-sm-6">
                                    <div class="form-group">
                                        {% csrf_token %}
                                        <input class="form-control valid" name="email" id="email" type="email" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Enter email address'" placeholder="Email">
                                    </div>
                                </div>
                                <div class="col-sm-6">
                                    <div class="form-group">
                                        {% csrf_token %}
                                        <input class="form-control valid" name="password1" id="password" type="password" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Create Password'" placeholder="Create Password">
                                    </div>
                                </div>
                                <div class="col-sm-6">
                                    <div class="form-group">
                                        {% csrf_token %}
                                        <input class="form-control valid" name="password2" id="password" type="password" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Confirm Password'" placeholder="Confirm Password">
                                    </div>
                                </div>
                            </div>

跟踪:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/account/register

Django Version: 2.2.7
Python Version: 3.7.3
Installed Applications:
['news.apps.NewsConfig',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "C:\Users\Maansi\AppData\Roaming\Python\Python37\site-packages\django\utils\datastructures.py" in __getitem__
  78.             list_ = super().__getitem__(key)

During handling of the above exception ('first_name'), another exception occurred:

File "C:\Users\Maansi\AppData\Roaming\Python\Python37\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\Maansi\AppData\Roaming\Python\Python37\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\Maansi\AppData\Roaming\Python\Python37\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\Maansi\projects\Learn\account\views.py" in register
  34.         first_name=request.GET['first_name']

File "C:\Users\Maansi\AppData\Roaming\Python\Python37\site-packages\django\utils\datastructures.py" in __getitem__
  80.             raise MultiValueDictKeyError(key)

Exception Type: MultiValueDictKeyError at /account/register
Exception Value: 'first_name'

first_name有什么问题。让我知道是否需要更多信息。

1 个答案:

答案 0 :(得分:1)

这是因为在first_name中找不到密钥request.POST

Python中,字典具有内置的静态方法.get()。当.get()找不到密钥时,默认情况下会返回None或您指定的值。

我的建议是使用.get()。这是示例-

更改

first_name=request.POST["first_name"]

first_name=request.POST.get("first_name", "default value")

此外,无需在每个输入字段之前写{% csrf_token %}。每个表格只需要一个csrf_token。因此,您可以删除其他的,只需将其中一个保留在form标签中即可。

相关问题