【发布时间】:2011-06-02 14:27:36
【问题描述】:
我在 Django 1.0 网站开发中复制了一个用户注册页面的简单示例。我定义了以下形式:
class RegistrationForm(forms.Form):
username = forms.CharField(label=u'Username', max_length=30)
email = forms.EmailField(label=u'Email')
password1 = forms.CharField(
label=u'Password',
widget=forms.PasswordInput()
)
password2 = forms.CharField(
label=u'Password (Again)',
widget=forms.PasswordInput()
)
def clean_password2(self):
if 'password1' in self.cleaned_data:
password1 = self.cleaned_data['password1']
password2 = self.cleaned_data['password2']
if password1 == password2:
return password2
raise forms.ValidationError('Passwords do not match.')
def clean_username(self):
print "Validating username..."
username = self.cleaned_data['username']
if not re.search(r'^\w+', username):
raise forms.ValidationError('Username can only contain '
'alphanumeric characters and the underscore.')
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError('Username is already taken')
如果已经使用了用户名,则使用普通表单验证来验证该字段,并且不会调用我的自定义清理方法。当表单提交到 register_page 时,form.is_valid() 返回 True。
为了让 Django 知道调用 clean_ 方法,需要做些什么吗?
def register_page(request):
if request.method == 'POST':
print "Posted to registration form"
form = RegistrationForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data['username'],
password=form.cleaned_data['password1'],
email=form.cleaned_data['email']
)
return HttpResponseRedirect('/')
else:
form = RegistrationForm()
return render_to_response(
'users/registration.html',
context_instance=RequestContext(request, {
'form' : form
})
【问题讨论】:
-
这很令人费解-应该调用您的干净方法。你确定你已经导入了正确的
RegistrationForm- 也许你在没有验证方法的地方有不同的版本? -
需要注意的是,
clean_fieldname方法不是按任何特定顺序调用的,所以clean_password2不能依赖password1已经在cleaned_data中。如果在password1之前处理password2,则可能会抛出ValidationError。 -
肯定会跳过 clean_username()。
标签: django validation forms