Django Form源码分析(2)

发布时间 2023-07-29 11:43:57作者: khalil12138

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]这个会拿到什么呢