使用字段定义字段的方式django.forms
只是一种方便的声明性语法。它并不能真正代表最终Form类或其实例在属性方面的外观。
表单具有一个元类(在不深入的情况下,元类是使用class
关键字声明一个类,而__init__
方法是使用括号创建一个类的实例的方法- 一种用于自定义正在创建的对象的钩子,在这种情况下元类的“class
!”是!),它在定义时从表单类中提取字段并将其添加到base_fields
字典中。实例化表单时,会将其base_fields
深层复制到fields
实例上的属性。
令人困惑的一点是,您.
用来访问在模板中显示的字段- 实际发生的事情是Django的模板引擎首先尝试使用字典式[]
访问来解析属性查找,并且基本表单类定义了__getitem__
一种利用该方法的方法为此,从表单实例的fields
dict中查找适当的字段,然后用BoundField
进行包装,包装器知道如何使用该字段和表单中的数据来显示该字段。