加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django clean方法在POST上抛出KeyError

发布时间:2020-12-16 23:02:16 所属栏目:Python 来源:网络整理
导读:当我尝试提交表单时,我会收到一个“密码”的KeyError. 跟踪: Request Method: POSTRequest URL: http://localhost:8000/register/Django Version: 1.2.1Python Version: 2.7.0Installed Applications:['django.contrib.auth','django.contrib.contenttypes'
当我尝试提交表单时,我会收到一个“密码”的KeyError.

跟踪:

Request Method: POST
Request URL: http://localhost:8000/register/
Django Version: 1.2.1
Python Version: 2.7.0
Installed Applications:
['django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','djangoproject1.authentication']
Installed Middleware:
('django.middleware.common.CommonMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware')


Traceback:
File "C:Python27libsite-packagesdjangocorehandlersbase.py" in get_response
  100.                     response = callback(request,*callback_args,**callback_kwargs)
File "C:Usersjec23My Java Projectsdjangoproject1srcdjangoproject1authenticationviews.py" in register
  20.         if rf.is_valid() and pf.is_valid():
File "C:Python27libsite-packagesdjangoformsforms.py" in is_valid
  121.         return self.is_bound and not bool(self.errors)
File "C:Python27libsite-packagesdjangoformsforms.py" in _get_errors
  112.             self.full_clean()
File "C:Python27libsite-packagesdjangoformsforms.py" in full_clean
  268.         self._clean_form()
File "C:Python27libsite-packagesdjangoformsforms.py" in _clean_form
  296.             self.cleaned_data = self.clean()
File "C:Usersjec23My Java Projectsdjangoproject1srcdjangoproject1authenticationforms.py" in clean
  16.         if self.cleaned_data['cpassword']!=self.cleaned_data['password']:

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

观点:

def register(request):
    if request.method == 'POST':
        rf = forms.RegisterForm(request.POST)
        pf = forms.ProfileForm(request.POST)
        if rf.is_valid() and pf.is_valid():
            newuser = User(username=rf.cleaned_data['username'],email=rf.cleaned_data['email'])
            newuser.set_password(rf.cleaned_data['password'])
            newuser.save()
            profile = pf.save(commit=False)
            profile.user = newuser
            profile.save()
            return HttpResponseRedirect("/register-success/")
        else:
            return render_to_response("authentication/index.html",{'form1': rf,'form2':pf})
    else:
        return main(request)

形式:

class RegisterForm(forms.Form):
    username = forms.CharField(min_length=6,max_length=15)
    password = forms.CharField(min_length=6,max_length=15,widget = forms.PasswordInput())
    cpassword = forms.CharField(label='Confirm Password',widget = forms.PasswordInput())
    email = forms.EmailField(label='E-mail Address')

    def clean(self):
        if self.cleaned_data['cpassword']!=self.cleaned_data['password']:
            raise forms.ValidationError("Passwords don't match")
        return self.cleaned_data

class ProfileForm(forms.ModelForm):
    phonenumber = forms.CharField(label='Phone Number')

    class Meta:
        model = UserProfile
        exclude = ('user')

解决方法

啊哈!您看到的验证错误消息实际上不是验证错误消息.让我解释.当使用as_p渲染模型窗体实例时,它将以下列方式呈现每个字段:
<p><label ...>fieldname</label> <input ... name="fieldname" /> HELP TEXT IF ANY</p>

字符串必需. 30个字符以内.您在字段右侧看到的字母,数字和@ /./ / – / _字符只不过是帮助文本.这个帮助文本取自模型定义 – 您可以通过访问django / contrib / auth / models.py并检查User类的定义来验证这一点.

当您覆盖用户名字段时,您将省略任何帮助文本.当然,“错误”消失了.

为了验证这个理论,在你的主要方法中做以下几点.

def main(request):
    uf = forms.UserForm()
    upf = forms.UserProfileForm()
    print "User form is bound:%s errors:%s" % (uf.is_bound,uf.errors)
    return render_to_response("authentication/index.html",{'form1': uf,'form2':upf})

更新

if self.cleaned_data['cpassword']!=self.cleaned_data['password']:

当用户不提供一个或两个密码和密码时,此行可能会导致麻烦.例如,尝试从Django shell:

>>> data = dict(username = 'admin',cpassword = 'foo',email='admin@bar.com')
>>> f = RegisterForm(data)
>>> f.is_bound
True
>>> f.is_valid()

Traceback (most recent call last):
  ...
  File "<pyshell#2>",line 8,in clean
    if self.cleaned_data['cpassword']!=self.cleaned_data['password']:
KeyError: 'password'

更改表单的清洁方法,以确保在比较之前两个值都存在.这样的东西

def clean(self):
    password = self.cleaned_data.get('password',None)
    cpassword = self.cleaned_data.get('cpassword',None)
    if password and cpassword and (password == cpassword):
        return self.cleaned_data
    else:
        raise forms.ValidationError("Passwords don't match")

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读