django - 如何在验证之前处理/清理字段

Aco*_*orn 26 django validation django-forms

我有一个表单,只有在清理后才需要验证.

你跑的时候会发生什么form.is_valid()?表单是否已清理,然后表单的已清理版本已经过验证?

我现在得到的行为是,如果我的领域在清洁之前没有通过验证,即使清洁会让它通过,也会is_valid()返回False.

难道我做错了什么?

码:

# View
class ContactForm(forms.Form):
    message = forms.CharField(widget=forms.Textarea, max_length=5)

    def clean_message(self):
        message = self.cleaned_data['message']
        return message.replace('a', '') # remove all "a"s from message

def contact(request):
    if request.method == 'POST':
        if form.is_valid():
            return HttpResponseRedirect('/contact/on_success/')
        else:
            return HttpResponseRedirect('/contact/on_failure/')
Run Code Online (Sandbox Code Playgroud)

如果邮件少于5个字符包括我想要form.is_valid()返回!Truea

是否可以clean_<fieldname>()追赶to_python()但之前run_validators()?或者我应该采取其他方式吗?

Rei*_*cke 35

我认为表单验证的过程(及其正确的顺序)确实有很好的记录.http://docs.djangoproject.com/en/dev/ref/forms/validation/#form-and-field-validation

你介意分享你的代码吗?clean每个表单域都有一个方法,负责运行to_python,validate并且run_validators(按此顺序).to_python接受窗口小部件的原始值,validate 将其强制转换为python类型,获取强制值并运行特定于字段的验证.

关于给出的代码更新的答案

clean_message所有其他验证已运行像后调用to_python,validate而且,最重要的是,run_validators.我认为最后一种方法将检查max_length是否违反了约束.所以你之后更改数据没有任何影响.

解决方案是在ValidationError这里筹集资金.删除max_length将避免对输入长度进行任何验证.

class ContactForm(forms.Form):
    message = forms.CharField(widget=forms.Textarea)

    def clean_message(self):
        message = self.cleaned_data['message']
        message = message.replace('a', '') # remove all "a"s from message
        if len(message) >= 5:
            raise ValidationError('Too many characters ...')
        return message
Run Code Online (Sandbox Code Playgroud)