【问题标题】:Django form.is_valid() not calling method clean_<fieldname>Django form.is_valid() 不调用方法 clean_<fieldname>
【发布时间】: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


【解决方案1】:

如果其他人通过谷歌到达这里并且上述答案没有帮助:

我遇到了同样的问题,结果证明我没有在表单元中将排除设置为元组:

class MyFormClass(ModelForm):
    class Meta:
        exclude = ('type_detail')  #wrong

代替:

class MyFormClass(ModelForm):
    class Meta:
        exclude = ('type_detail', )  #right

【讨论】:

  • 什么意思?排除在哪里?它不在原始问题中。
【解决方案2】:

这真是令人费解。我恢复了 forms.py 的自动保存版本,它神奇地开始工作,但我可以辨别上面的代码 sn-p 和恢复的文件之间没有区别。

简答:“程序员错误”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2013-02-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多