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/给的是先验证后clean2.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属性字典赋值。