为什么我的Django表单没有引发验证错误?

2024-10-17 06:30:22 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是我的表格代码:

class ConfirmEmailForm(forms.Form):
    email = forms.EmailField()
    subscribe = forms.IntegerField()
    code = forms.CharField(max_length=80)

    def clean_subscribe(self):
        value = bool(self.cleaned_data['subscribe'])
        self.cleaned_data['subscribe'] = value
        return value

    def clean(self):
        cleaned_data = super(ConfirmEmailForm, self).clean()
        email = cleaned_data['email']
        code = cleaned_data['code']
        user = User.objects.filter(username=email).first()
        if not user:
            raise forms.ValidationError('Email not found')
        self.cleaned_data['user'] = user
        if user.emailverification.is_key_expired():
            raise forms.ValidationError('Link expired, please regenerate')
        if not user.emailverification.key == code:
            raise forms.ValidationError('Invalid Link')
        return cleaned_data

我用这张表格申请GET。现在,当我发送没有email字段的请求时,我原以为错误将在cleaned_data处出现,但是它不会引发任何错误,而是在下一行得到KeyError。在

显然,它将引发一个KeyError,因为它不存在。但是我的问题是,为什么这个错误没有出现在super(ConfirmEmailForm, self).clean()本身。在

以下是完整的回溯:

^{pr2}$

为什么会这样?我怎么解决这个问题?访问clean中已验证和清理的数据的正确方法是什么?在


Tags: selfcleandataifvalueemailnotcode
3条回答

如果clean方法得到一个错误,它将把它添加到错误列表中,它不会引发它。在

您可以找到代码here。在

        except ValidationError as e:
            self.add_error(name, e)

您可以使用cleaned_data.get('email')来解决它,如果找不到值,它将返回None,然后您可以对其进行检查。在

我认为这是因为当你使用clean方法时,这个方法引发的任何ValidationError都不会与某个特定的字段相关联

尝试创建一个除此之外的自定义。在

在执行cleaned_data['email']之前,请检查是否存在任何错误。在

def clean(self):
    cleaned_data = super(ConfirmEmailForm, self).clean()

    if any(self.errors):
        return self.errors

    email = cleaned_data['email']
    code = cleaned_data['code']

希望这对你有用。在

相关问题 更多 >