Django KeyError在/ register / [英] Django KeyError at /register/

查看:154
本文介绍了Django KeyError在/ register /的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



问题是当用户提交单个字段而不是整个表单时例如电子邮件。我收到这个错误

  KeyError at / register / 

密码
请求方法:POST
请求URL:http://127.0.0.1:8000/register/
文件C:\Python26\Lib\site-packages\django\forms\forms.py在_get_errors
115. self.full_clean()
文件C:\Python26\Lib\site-packages\django\forms\forms.py在full_clean
271. self._clean_form()
文件C:\Python26\Lib\site-packages\django\forms\forms.py在_clean_form
299. self.cleaned_data = self.clean()
文件C:\o\17\mysite\pet\forms.pyin clean
31.如果self.cleaned_data ['password']!= self.cleaned_data ['password1']:

异常类型:KeyError at / register /
异常值:password

我试图用if修复这个解决方案。如果用户提交了用户名或任何其他必填字段,请处理该表单,否则重新显示原始表单。



但我仍然收到相同的错误。



这是我已编辑的views.py (页面底部是我原来的RegistrationForm)

  def PetRegistration(request):
if request.user.is_authenticated():
return HttpResponseRedirect(reverse('world:HappyLand' ))

如果request.method =='POST':
form = UserRegistration(request.POST)
如果form.is_valid():
username = form .cleaned_data ['username']
如果用户名:
email = form.cleaned_data ['email']
如果电子邮件:
password = form.cleaned_data ['password']
如果密码:
user = User.objects.create_user(
username = form.cleaned_data ['username'],
email = form.cleaned_data ['email'],
password = form.cleaned_data ['password']

user.is_active = True
user.first_name = form.cleaned_data ['name']
user.save()

person = authenticate(
username = form.cleaned_data ['username'],
password = form.cleaned_data ['password']


Person.objects.create(user_id = user.id,
name = form.cleaned_data ['name'],birthday = form.cleaned_data ['birthday']

login(request,person)
return HttpResponseRedirect(reverse('world:HappyLand'))

return render register.html',{'form':UserRegistration()})

我如何解决这个错误而且还可以在另一个fi上显示错误消息用户未填写的字段为错误缺失字段,请填写此字段。

  def PetRegistration(request) :
如果request.user.is_authenticated():
返回HttpResponseRedirect(reverse('world:HappyLand'))

如果request.method =='POST':
form = UserRegistration(request.POST)
如果form.is_valid():
user = User.objects.create_user(
username = form.cleaned_data ['username'],
email = form.cleaned_data ['email'],
password = form.cleaned_data ['password']

user.is_active = True
user.first_name = form .cleaned_data ['name']
user.save()

person = authenticate(
username = form.cleaned_data ['username'],
password = form .cleaned_data ['password']


Person.objects.create(user_id = user.id,
name = form.cleaned_data ['name'],birthday = form.cleaned_data ['birthday']

login(request,person)
返回HttpResponseRedirect(reverse('world:HappyLand' )

return render(request,'register.html',{'form':UserRegistration()})

我的forms.py

  class UserRegistration(forms.Form):
username = forms.CharField()
name = forms.CharField()
email = forms.EmailField()
birthday = forms.DateField(widget = extras.SelectDateWidget(years = range(1950 ,$)$)

password = forms.CharField(
widget = forms.PasswordInput(render_value = False)

password1 = forms.CharField(
label =(u'Verify Password'),
widget = forms.PasswordInput(render_value = False)


def clean_username(self):
username = self.cleaned_data ['username']
try:
User.objects.get(username = username)
除了User.DoesNotExist:
返回用户名
raise forms.ValidationError(
该用户已被采取,请选择另一个)

def clean(self):
if self.cleaned_data ['password']!= self.cleaned_data ['password1']:
raise forms.ValidationError(密码不符合)
return self.cleaned_data

我的models.py

  class Person(models.Model):
user = models.ForeignKey(User)
name = models.CharField
生日= models.DateField(blank = True,null = True)
def __unicode __(self):
return self.name


解决方案

问题是你的 clean()。在 clean()中,您正尝试访问表单的 clean_data 密码 C $ C>。 密码仅在 clean_data 中可用,如果用户已填写此字段。所以,在尝试访问密码之前,您必须检查 cleaning_data



更改 clean()

  def clean(self):
如果self.cleaned_data中的password和self.cleaned_data中的password1和self.cleaned_data ['password']!= self.cleaned_data ['password1']:
raise forms.ValidationError(密码不匹配)
return self.cleaned_data

您可以在表单字段上提供关键字参数 error_messages ,以显示错误消息,如错误遗漏字段,请填写此字段。

  class SomeForm(forms.Form):
name = forms.CharField(error_messages = {'required':'Error Missing Field,Please fill this Field'} )

您的看法有一个错误。



is_valid()填写表单上的错误,但是同一个表单实例必须是发送到模板,以便您可以访问表单的字段上的错误。



但在您看来,您只需一次调用 render )即使在发布请求时发生无效的表单也会被调用。而在这个 render()中,您正在创建一个新的表单实例。所以,你发送给模板的这个新表单不会有任何错误。



所以,稍微修改你的意见:

  def PetRegistration(request):
if request.user.is_authenticated():
return HttpResponseRedirect(reverse('world:HappyLand'))

form = UserRegistration()#这将用于GET请求
如果request.method =='POST':
form = UserRegistration(request.POST)#This将在POST请求中使用
如果form.is_valid():
user = User.objects.create_user(
username = form.cleaned_data ['username'],
email = form .cleaned_data ['email'],
password = form.cleaned_data ['password']

user.is_active = True
user.first_name = form.cleaned_data ['name ']
user.save()

person = authenticate(
username = form.cleaned_data ['username'],
password = form.cleaned_data ['password']


Person.objects.create(user_id = user.id,
name = form.cleaned_data ['name'],birthday = form.cleaned_data ['birthday']

login(request,person)
return HttpResponseRedirect(reverse world:HappyLand'))

return render(request,'register.html',{'form':form})

请注意,在您的视图中,我检查了POST请求之前是否添加了 form = UserRegistration(),并添加了注释在我们实例化的两个地方 UserRegistration 。然后在 render()中,您应该发送这个表单



然后你的 {{form.username.errors}} 将工作。


I have a registration that let users register and i'm having difficulty fixing it.

The problem is when a user submits a single field instead of the whole form for example an email . I get this error

KeyError at /register/

password
Request Method:     POST
Request URL:    http://127.0.0.1:8000/register/
File "C:\Python26\Lib\site-packages\django\forms\forms.py" in _get_errors
  115.             self.full_clean()
File "C:\Python26\Lib\site-packages\django\forms\forms.py" in full_clean
  271.         self._clean_form()
File "C:\Python26\Lib\site-packages\django\forms\forms.py" in _clean_form
  299.             self.cleaned_data = self.clean()
File "C:\o\17\mysite\pet\forms.py" in clean
  31.       if self.cleaned_data['password'] != self.cleaned_data['password1']:

Exception Type: KeyError at /register/
Exception Value: password

I tried to fix this solution using if . If user has a submitted a username or any other required field , process the form otherwise redisplay the original form.

but I still get the same error.

This is my edited views.py (at the bottom of the page is my original RegistrationForm)

def PetRegistration(request):   
    if request.user.is_authenticated():
        return HttpResponseRedirect(reverse('world:HappyLand'))

    if request.method =='POST':
        form = UserRegistration(request.POST)
    if form.is_valid():
        username = form.cleaned_data['username']
        if username:
            email=form.cleaned_data['email']
            if email:
                password=form.cleaned_data['password']
                if password:
                    user = User.objects.create_user(
            username=form.cleaned_data['username'], 
            email=form.cleaned_data['email'], 
            password=form.cleaned_data['password']
            )
                    user.is_active = True
                    user.first_name = form.cleaned_data['name']
                    user.save()

                    person = authenticate(
            username=form.cleaned_data['username'], 
            password=form.cleaned_data['password']
            )

                    Person.objects.create(user_id=user.id, 
                    name=form.cleaned_data['name'],birthday=form.cleaned_data['birthday'])

                    login(request, person)
                    return HttpResponseRedirect(reverse('world:HappyLand'))

return render(request, 'register.html', {'form': UserRegistration()})

How can I fix this error and also how could I display an error message on the other fields that the user didn't fill out like "Error Missing Field , Please Fill this Field".

def PetRegistration(request):   
if request.user.is_authenticated():
    return HttpResponseRedirect(reverse('world:HappyLand'))

if request.method =='POST':
    form = UserRegistration(request.POST)
    if form.is_valid():
        user = User.objects.create_user(
            username=form.cleaned_data['username'], 
            email=form.cleaned_data['email'], 
            password=form.cleaned_data['password']
            )
        user.is_active = True
        user.first_name = form.cleaned_data['name']
        user.save()

        person = authenticate(
            username=form.cleaned_data['username'], 
            password=form.cleaned_data['password']
            )

        Person.objects.create(user_id=user.id, 
            name=form.cleaned_data['name'],birthday=form.cleaned_data['birthday'])

        login(request, person)
        return HttpResponseRedirect(reverse('world:HappyLand'))

return render(request, 'register.html', {'form': UserRegistration()})

My forms.py

class UserRegistration(forms.Form):
    username = forms.CharField()
    name = forms.CharField()
    email = forms.EmailField()
    birthday = forms.DateField(widget=extras.SelectDateWidget(years=range(1950, 2012)))

    password = forms.CharField(
        widget=forms.PasswordInput(render_value=False)
        )
    password1 = forms.CharField(
        label=(u'Verify Password'), 
        widget = forms.PasswordInput(render_value=False)
        )

    def clean_username(self):
        username = self.cleaned_data['username']
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(
            "That user is already taken , please select another ")

    def clean(self):
        if self.cleaned_data['password'] != self.cleaned_data['password1']:
            raise forms.ValidationError("The password does not match ")
        return self.cleaned_data

My models.py

class Person(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=100, blank=True)
    birthday = models.DateField(blank=True,null=True)
    def __unicode__(self):
        return self.name

解决方案

Problem is with your clean(). In clean(), you are trying to access field password on form's cleaned_data. password will only be available on cleaned_data if the user has filled this field. So, you must check that password is there in cleaned_data before trying to access it.

Changing your clean():

def clean(self):
    if 'password' in self.cleaned_data and 'password1' in self.cleaned_data and self.cleaned_data['password'] != self.cleaned_data['password1']:
        raise forms.ValidationError("The password does not match ")
    return self.cleaned_data

You can provide a keyword argument error_messages on form field for showing error message like "Error Missing Field , Please Fill this Field".

class SomeForm(forms.Form):
    name = forms.CharField(error_messages={'required':'Error Missing Field , Please Fill this Field'})

There is a bug in your view.

is_valid() populates errors on the form but this same form instance must be sent to the template so that you can access the errors on the form's fields.

But in your view, you have only one call to render() which gets called even in case of an invalid form on a post request. And in this render(), you are creating a new instance of form. So, this new form which you are sending to template will not have any errors.

So, making slight modification to your view:

def PetRegistration(request):   
    if request.user.is_authenticated():
    return HttpResponseRedirect(reverse('world:HappyLand'))

    form = UserRegistration() #This will be used in GET request
    if request.method =='POST':
        form = UserRegistration(request.POST) #This will be used in POST request
        if form.is_valid():
            user = User.objects.create_user(
                username=form.cleaned_data['username'], 
                email=form.cleaned_data['email'], 
                password=form.cleaned_data['password']
            )
            user.is_active = True
            user.first_name = form.cleaned_data['name']
            user.save()

            person = authenticate(
                username=form.cleaned_data['username'], 
                password=form.cleaned_data['password']
            )

            Person.objects.create(user_id=user.id, 
                name=form.cleaned_data['name'],birthday=form.cleaned_data['birthday'])

            login(request, person)
            return HttpResponseRedirect(reverse('world:HappyLand'))

    return render(request, 'register.html', {'form': form})

Notice in your view, I have added form=UserRegistration() before checking if its POST request, and have added the comment at two places where we are instantiating UserRegistration. And then in render(), you should send this form.

Then your {{form.username.errors}} will work.

这篇关于Django KeyError在/ register /的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆