我正在登录和注册页面,但仍然遇到此错误:
MultiValueDictKeyError at /pokesregister/
"'name'"
下面是我的views.py代码(以及根据谷歌搜索我试过的各种内容评论的行):
from django.shortcuts import render, HttpResponse, redirect
from .models import User
from django.core.urlresolvers import reverse
def index(request):
return render(request, 'poke/index.html')
def login(request):
print '*'*75
if request.method == 'POST':
user_tuple = User.userManager.login(request.POST['email'], request.POST['password'])
if user_tuple[0]: # true or false from the returned tuple
request.session['id'] = user_tuple[1].id
request.session['name'] = user_tuple[1].name + " " + user_tuple[1].alias
return render(request, 'poke/pokes.html')
else:
return render(request,'poke/pokes.html', user_tuple[1])
return HttpResponse('login')
def register(request):
print '*'*75
print request.POST['name']
user_tuple = User.userManager.register(request.POST['name'], request.POST['alias'], request.POST['email'], request.POST['password'], request.POST['confirm_password'], request.POST['dob'])
# name = request.POST.get('name')
# user_tuple = User.userManager.register(request.GET.get('name', False), request.GET.get('alias', False), request.GET.get('email', False), request.GET.get('password', False), request.GET.get('confirm_password', False), request.GET.get('dob', False))
if user_tuple[0]:
return render(request, 'poke/pokes.html', user_tuple[1])
else:
return render(request, 'poke/index.html', user_tuple[1])
以下是我的models.py:
from __future__ import unicode_literals
import bcrypt
from django.db import models
import re
EMAIL_REGEX = re.compile(r'^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9._-]+.[a-zA-Z]*$')
class UserManager(models.Manager):
def login(self, email, password):
try:
user = self.get(email__iexact=email) # case insensitive comparison
user2 = self.filter(email__iexact=email)
print user
print user2
print user.password
if user and bcrypt.hashpw(password.encode('utf-8'),user.password.encode('utf-8')) == user.password.encode('utf-8'):
return (True, user)
# should be classified as a successful login event
return(False,{"login": "login failed"})
except:
print "Failed"
return(False,{"login": "login failed"})
def register(self, name, alias, email, password, confirm_password, dob):
errors = {}
if len(name) < 2:
errors['name'] = "Name is too short"
if len(alias) < 2:
errors['alias'] = "Alias is too short"
if len(password) < 8:
errors['password'] = "Password is too short"
if password != confirm_password:
errors['confirm_password'] = "Passwords must match"
try:
if user == self.get(email__iexact=email):
errors['invalid'] = "Invalid registration"
except:
pass
if not EMAIL_REGEX.match(email):
errors['email'] = "Please enter a valid email"
if dob:
pass
if errors:
return (False, errors)
else:
# register this person!
password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
user = self.create(name=name, alias=alias, password=password, email=email, dob=dob)
user.save()
print(User.objects.all())
return (True, {"Success":"success"})
class User(models.Model):
name = models.CharField(max_length=45)
alias = models.CharField(max_length=45)
email = models.EmailField() # auto validation for us!
password = models.CharField(max_length=255)
pokes = models.IntegerField(default=0)
dob = models.DateField(auto_now=False, auto_now_add=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
userManager = UserManager()
objects = models.Manager()
class Pokers(models.Model):
user1 = models.ForeignKey(User, related_name="f1")
user2 = models.ForeignKey(User, related_name="f2")
created_at = models.DateField(auto_now_add=True)
updated_at = models.DateField(auto_now=True)
最后,这是我的urls.py文件:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name = 'index'),
url(r'^register/$', views.register, name = 'register'),
url(r'^login/$', views.login, name = 'login'),
]
如果有人知道这里会发生什么,我真的很感激一些建议。我之前使用过这一行,并使其有效,但我不确定如何:
user_tuple = User.userManager.register(request.POST['name'],
request.POST['alias'], request.POST['email'],
request.POST['password'], request.POST['confirm_password'],
request.POST['dob'])
我为任何明显的错误道歉,因为我对所有这些都很新(显然)。
谢谢!
答案 0 :(得分:0)
您收到错误,因为您尝试获取的密钥(&#39;名称&#39;)不存在。如果存在用户请求注册视图而没有&#39;名称&#39;键,然后它会抛出一个错误。
而不是:
request.POST['name']
执行:
request.POST.get('name', False);
如果名称不存在,则该方法返回False而不是抛出错误。
我还建议检查它是POST还是GET,类似于你在登录视图中的操作。 (如果request.method ==&#39; POST&#39;)