zoukankan      html  css  js  c++  java
  • django form的函数用法

    版权归作者所有,任何形式转载请联系作者。
    作者:petanne(来自豆瓣)
    来源:https://www.douban.com/note/296298497/

    今天头针对form里的几个方法讲了不少东西,顿时茅塞顿开

    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属性字典赋值。

  • 相关阅读:
    【C语言疯狂讲义】(三)C语言运算符
    RAII手法封装相互排斥锁
    《Java并发编程实战》第十一章 性能与可伸缩性 读书笔记
    Nginx之红黑树
    我第一家互联网公司产品开发周期
    javascript中的XML
    哈夫曼树
    【HttpClient4.5中文教程】【第一章 :基础】1.1运行请求(二)
    H3C开启Ssh
    H3C创建本地用户
  • 原文地址:https://www.cnblogs.com/ermei/p/7424128.html
Copyright © 2011-2022 走看看