django中与表单相关的字段及其验证器

xiaoxiao2021-02-28  60

form.py

from django import forms def words_validator(comment): if len(comment) < 4: raise ValidationError('Not Enough words') class CommentForm(forms.Form): name = forms.CharField(max_length=50) comment = forms.CharField( validators = [words_validator] ) def password_validator(comment): if len(password) < 8: raise ValidationError('请输入八位数以上的密码') if [0,1,2,3,4,5,6,7,8,9] in password: raise ValidationError('请输入至少一个数字')

绑定表单

if request.method == "POST": data = request.POST form = CommentForm(data) if request.method == 'POST': data = {'name':'geeklee','class':'学霸班'} form = CommentForm(data) if form.is_valid(): name = form.cleaned_data['name'] comment = form.cleaned_data['comment'] c = Comment(name=name,comment=comment) c.save() return redirect(to='detail') #判断表单的数据是否通过验证,如果通过验证就放到cleaned_data里面存起

1.form类的运行顺序是init,clean,validte,save 其中clean和validate会在form.is_valid()方法中被先后调用。(这里留有一个疑问,结构完全相同的两个form,但是一个为先验证后clean,另一个先clean后验证。原因不明。) 这里https://docs.djangoproject.com/en/dev/ref/forms/validation/给的是先验证后clean

2.cleaned_data中的值类型与字段定义的Field类型一致。 如果字段定义charfield,那么clean方法返回的cleaned_data中对应的字段值就是字符型, 定义为ModelChoiceField,则cleaned_data中字段值是某个model实例。 定义为ModelMultipleChoiceField,则cleaned_data中字段值是个model实例list。

3.clean等步骤遇到的异常:Exception Value: argument of type ‘NoneType’ is not iterable. 可能是cleaned_data中某个字段值应该是个列表,实际上却是空值。

4.ModelForm的Meta类中定义的fields 默认的Field是Model中定义的Field,如需更改,可在Form类内以同名字段覆盖,比如自定义widget和required属性等。 不管字段在form中怎么自定义,cleaned_data中对应的值都必须按照model中定义的字段类型取值,否则校验不通过或保存时报错。

暂时记这几条,form还可以重写init、save方法,并且可以自定义方法。如果对这几个东西不懂,想办法找例子读一遍就懂了。

※※※ clean方法重写时一定不要忘了return cleaned_data ※※※

补充: 5.form的四种初始化方式 ①实例化oneform(initial={‘onefield’:value}) ②定义字段时给初始化值oneformfield = forms.CharField(initial=value) ③重写Form类的init()方法:self.fields[‘onefield’].initial = value ④当给form传参instanse(即oneform(instanse=onemodel_instance))时,前三种初始化方法会全部失效,即使重写init时,先调用父类的init再使用方法③,仍然无效(不是很爽)。 这时想重新初始化字段值只能在init()里 self.initial[‘title’] = value,直接对Form类的initial属性字典赋值。

转载请注明原文地址: https://www.6miu.com/read-79857.html

最新回复(0)