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

来源:互联网 发布:我想做淘宝怎么弄 编辑:程序博客网 时间:2024/05/18 02:44

form.py

from django import formsdef 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属性字典赋值。

原创粉丝点击