Django登录和注册项目中的MultiValueDictKeyError

时间:2016-06-24 19:35:26

标签: python django

我正在登录和注册页面,但仍然遇到此错误:

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

我为任何明显的错误道歉,因为我对所有这些都很新(显然)。

谢谢!

1 个答案:

答案 0 :(得分:0)

您收到错误,因为您尝试获取的密钥(&#39;名称&#39;)不存在。如果存在用户请求注册视图而没有&#39;名称&#39;键,然后它会抛出一个错误。

而不是:

request.POST['name']

执行:

request.POST.get('name', False);

如果名称不存在,则该方法返回False而不是抛出错误。

我还建议检查它是POST还是GET,类似于你在登录视图中的操作。 (如果request.method ==&#39; POST&#39;)