1 前置知识点
1.1 render函数
可以看到render函数先拿到模板, 再进行模板渲染
那么form函数是如何自动生成表单里的input标签呢,
应该是在form里已经渲染好一遍生成了input标签放进了{"form": form}的集合
render函数再进行渲染
2 Form函数
2.1 Form源码分析
2.1.1 Form初始化
当我们自己写了个视图函数用来测试时
发现
可以看到在
LoginForm2里定义了 Charfield
然后 LoginForm2继承了LoginForm
LoginForm里也封装了CharField
在这里可以看到LoginForm2 LoginForm Form都是由
metaclass=DeclarativeFieldsMetaclass
这个元类创建
由如下打印信息可以看出来先封装LoginForm再封装额LoginForm2
先看LoginForm封装了什么
上面的username:.. password:... 都是CharField类型基类都是Field, 添加进集合
调用super()就是MediaDefiningClass的__new__创建类
这里又调用super()就是type可以看到还是由type创建
django项目开始运行
如果拿
LoginForm2.base_fields = {
CharField()
CharField()
CharField()
}
__new__方法完事了, 看看__init__
找到BaseForm的__init__
自己定义的render没有FORM_RENDERER 去全局配置找
到这init部分结束 初始化结束
2.1.2 Form渲染
HTML中 for field in form 就相当于
python中的 form[field]这个会拿到什么呢
标签:__,Form,form,LoginForm2,Django,源码,CharField,LoginForm From: https://www.cnblogs.com/khalil12138/p/17587316.html