django BaseForm类 迭代器解析
django Form类
django框架在编写template模板时,通过操作form变量来获取后端代码整合的表单对象内容,后端使用的就是django提供的Form类 ( 官方表单使用教学)。
template form iter
下图为个人项目中对form的应用示例:
template中的form变量怎么来的
后端FormView类通过form_class变量将表单类向上传递
form django.views.generic.edit import FormView
# FormView使用样例,form_class赋值方式
class FormViewObject(FormView):
....
form_class = FormObject # 组装好的Form类
....
# 本次关注的部分源代码,FormMixin为FormView的父类
# 通过调用该类的get_context_data方法初始化Form类(请求为get方式时,调用get_context_data方法)
class FormMixin(ContextMixin)
def get_form_class(self):
return self.form_class
def get_form(self, form_class=None):
if form_class is None:
form_class = self.get_form_class()
return form_class(**self.get_form_kwargs())
def get_context_data(self, **kwargs):
if 'form' not in kwargs:
kwargs['form'] = self.get_form()
return super().get_context_data(**kwargs)
Form类的迭代器
Form通过定义__iter__内置函数来实现迭代器,在Form类或其父类中找到该函数即可
class Form(BaseForm, metaclass=DeclarativeFieldsMetaClass):
...
@html_safe
class BaseForm
...
def __iter__(self):
for name in self.fields:
yield self[name]
总结
template对form的迭代结果就是拿出Form类中组装的Field类对象。