表单.py存在的问题

3

当我提交表单时,我在forms.py的第25行的password1=self.cleaned_data['password1']处遇到了KeyError错误。以下是文件的代码:

forms.py的代码如下:

from django import forms
from django.contrib.auth.models import User
from django.forms import ModelForm
from drinker.models import Drinker

class RegistrationForm(ModelForm):
       username   = forms.CharField(label=(u'User Name'))
       email      = forms.EmailField(label=(u'Email Address'))
       password   = forms.CharField(label=(u'Password'), widget=forms.PasswordInput(render_value=False))
       password1   = forms.CharField(label=(u'Verify Password'), widget=forms.PasswordInput(render_value=False))

       class Meta:
              model=Drinker
              exclude=('user',)

       def clean_username(self):
                username=self.cleaned_data['username']
                try:
                      User.objects.get(username=username)
                except User.DoesNotExist:
                      return username
                raise forms.ValidationError("The Username is already taken, please try another.")
       def clean_password(self):
                password=self.cleaned_data['password']
                password1=self.cleaned_data['password1']
                if password != password1:
                    raise forms.ValidationError("The Password did not match, please try again.")
                return password

The code of html file is:

{% extends "base.html" %}
{% block extrahead %}
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
    <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js" type="text/javascript"></script>
    <script>
    $(function() {
        $( "#id_birthday" ).datepicker();
    });
    </script>
{% endblock %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{% if form.errors %}<p>Please correct the following fields:</p>{% endif %}
<div class="register_div">
    {% if form.username.errors %}<p class="error">{{ form.username.errors }}</p>{% endif %}
    <p><label for="username"{% if form.username.errors %} class="error"{% endif %}>Username:</label></p>
    <p>{{ form.username }}</p>
</div>
<div class="register_div">
    {% if form.email.errors %}<p class="error">{{ form.email.errors }}</p>{% endif %}
    <p><label for="email"{% if form.email.errors %} class="error"{% endif %}>Email:</label></p>
    <p>{{ form.email }}</p>
</div>
<div class="register_div">
    {% if form.password.errors %}<p class="error">{{ form.password.errors }}</p>{% endif %}
    <p><label for="password"{% if form.password.errors %} class="error"{% endif %}>Password:</label></p>
    <p>{{ form.password }}</p>
</div>
<div class="register_div">
    {% if form.password1.errors %}<p class="error">{{ form.password1.errors }}</p>{% endif %}
    <p><label for="password1"{% if form.password1.errors %} class="error"{% endif %}>Password1:</label></p>
    <p>{{ form.password1 }}</p>
</div>
<div class="register_div">
    {% if form.birthday.errors %}<p class="error">{{ form.birthday.errors }}</p>{% endif %}
    <p><label for="birthday"{% if form.birthday.errors %} class="error"{% endif %}>Birthday:</label></p>
    <p>{{ form.birthday }}</p>
</div>
<div class="register_div">
    {% if form.name.errors %}<p class="error">{{ form.name.errors }}</p>{% endif %}
    <p><label for="name"{% if form.name.errors %} class="error"{% endif %}>Name:</label></p>
    <p>{{ form.username }}</p>
</div>
<p><input type="submit" value="submit"/></p>
</form>
{% endblock %}

视图文件是

from django.http import HttpResponseRedirect
from django.contrib.auth.models import User
from django.shortcuts import render_to_response
from drinker.models import Drinker
from django.template import RequestContext
from drinker.forms import RegistrationForm

def DrinkerRegistration(request):
    if request.user.is_authenticated():
         return HttpResponseRedirect('/profile/')
    if request.method == 'POST':
         #return render_to_response('register')
         form = RegistrationForm(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.save()
 #                 drinker=user.get_profile()
  #                drinker.name=form.cleaned_data['name']
   #               drinker.birthday=form.cleaned_data['birthday']
    #              drinker.save()
                 drinker=Drinker(user=user,name=form.cleaned_data['name'],birthday=form.cleaned_data['birthday'])  
                  drinker.save()    
                  return HttpResponseRedirect('/profile/')
         else:
                  return render_to_response('register.html',{'form':form} , context_instance=RequestContext(request))  
    else:
         ''' user is not submitting the form, show them a blank registration form '''

         form = RegistrationForm()
         context={'form':form}
         return render_to_response('register.html',context , context_instance=RequestContext(request))
1个回答

2
Django会为表单中的每个字段调用clean_xxx()方法。当字段有效时,它将把键值对添加到cleaned_data中。当Django调用clean_password并且尚未处理字段password1时,cleaned_data不会包含password1的键值对。这就是您当前遇到的错误。
要解决此问题,您需要将密码验证移动到clean()中,在Django逐个检查每个字段后调用该方法。此方法可用于执行涉及表单多个字段的验证(即整个表单)。
这也有意义,因为您想引发的错误涉及passwordpassword1之间的不匹配,而不仅仅是当前正在清理的字段password

我明白了!但是现在我正在提交表单 如果用户已通过身份验证,则进入个人资料页面 但当我尝试注册用户时,它总是重定向到register.html 我已经检查了我的代码,并发现`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.save()`这一部分不起作用。 - user786

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接