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)
| 归档时间: |
|
| 查看次数: |
44971 次 |
| 最近记录: |