Django Form源码分析(2)
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]这个会拿到什么呢



浙公网安备 33010602011771号