/account/register 处的 MultiValueDictKeyError
MultiValueDictKeyError at /account/register
错误:
/account/register 处的 MultiValueDictKeyError
'first_name'
请求方法:POST
请求 URL:http://127.0.0.1:8000/account/register
Django 版本:2.2.7
异常类型:MultiValueDictKeyError
异常值:
'first_name'
异常位置:C:\Users\Maansi\AppData\Roaming\Python\Python37\site-packages\django\utils\datastructures.py in getitem, line 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 有什么问题。如果需要更多信息,请告诉我。
是因为在request.POST
中找不到keyfirst_name
。
在Python
中,字典有一个内置的静态方法.get()
。当 .get()
找不到密钥时,默认 returns None
或您指定的值。
我的建议是使用.get()
。这是示例-
改变
first_name=request.POST["first_name"]
到
first_name=request.POST.get("first_name", "default value")
此外,无需在每个输入字段前都写上{% csrf_token %}
。每个表格只需要一个 csrf_token
。所以你可以删除其他的,只需要在表单标签中保留一个。
检查 register.html 的名字字段并确保名字输入字段的名称必须为 first_name。
例如
<input type="text" name="first_name" class="form-control" required>
错误:
/account/register 处的 MultiValueDictKeyError
'first_name'
请求方法:POST
请求 URL:http://127.0.0.1:8000/account/register
Django 版本:2.2.7
异常类型:MultiValueDictKeyError
异常值:
'first_name'
异常位置:C:\Users\Maansi\AppData\Roaming\Python\Python37\site-packages\django\utils\datastructures.py in getitem, line 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 有什么问题。如果需要更多信息,请告诉我。
是因为在request.POST
中找不到keyfirst_name
。
在Python
中,字典有一个内置的静态方法.get()
。当 .get()
找不到密钥时,默认 returns None
或您指定的值。
我的建议是使用.get()
。这是示例-
改变
first_name=request.POST["first_name"]
到
first_name=request.POST.get("first_name", "default value")
此外,无需在每个输入字段前都写上{% csrf_token %}
。每个表格只需要一个 csrf_token
。所以你可以删除其他的,只需要在表单标签中保留一个。
检查 register.html 的名字字段并确保名字输入字段的名称必须为 first_name。
例如
<input type="text" name="first_name" class="form-control" required>