Django 和表单集
Django and formsets
我试图了解 Django 表单集的内部工作原理。
在formset_factory函数创建了一个表单集class之后,BaseFormSet的inheriting/getting属性,初始化了新创建的class的一个对象,例子:
ArticleFormSet = formset_factory(ArticleFormA, extra=2)
formset = ArticleFormSet()
如果我检查 dir(formset)
表单和表单属性都可用,但如果我尝试打印 forms
什么也没有打印,我想这与装饰器有关 @cached_property
(但什么时候调用?)
在 formset 对象的初始化中没有与 forms
属性相关的操作。
所以,我想是在调用 {{formset}} 或 {{formset.as_p}} 等时调用的。
方法有:
forms = ' '.join(form.as_p() for form in self)
为什么在self中,我不明白,因为基于dir()的form只是一个class,而self是formset对象。背后的逻辑是什么?
(PS 我明白每个表单都在做什么),但不是表单中的表单,除了事实表单现在已填充
之后,使用之前的 management_form 创建字段。
return mark_safe('\n'.join([six.text_type(self.management_form), forms]))
form in self
导致调用特殊方法 self.__iter__()
,这就是在 python 中实现可迭代 类 的方式。
This method is called when an iterator is required for a container. This method should return a new iterator object that can iterate over all the objects in the container. For mappings, it should iterate over the keys of the container.
对于django的formsets,这是相关的代码。
class BaseFormSet(object):
"""
A collection of instances of the same Form class.
"""
def __iter__(self):
"""Yields the forms in the order they should be rendered"""
return iter(self.forms)
@cached_property
def forms(self):
"""
Instantiate forms at first property access.
"""
# DoS protection is included in total_form_count()
forms = [self._construct_form(i, **self.get_form_kwargs(i))
for i in range(self.total_form_count())]
return forms
我试图了解 Django 表单集的内部工作原理。
在formset_factory函数创建了一个表单集class之后,BaseFormSet的inheriting/getting属性,初始化了新创建的class的一个对象,例子:
ArticleFormSet = formset_factory(ArticleFormA, extra=2)
formset = ArticleFormSet()
如果我检查 dir(formset)
表单和表单属性都可用,但如果我尝试打印 forms
什么也没有打印,我想这与装饰器有关 @cached_property
(但什么时候调用?)
在 formset 对象的初始化中没有与 forms
属性相关的操作。
所以,我想是在调用 {{formset}} 或 {{formset.as_p}} 等时调用的。
方法有:
forms = ' '.join(form.as_p() for form in self)
为什么在self中,我不明白,因为基于dir()的form只是一个class,而self是formset对象。背后的逻辑是什么?
(PS 我明白每个表单都在做什么),但不是表单中的表单,除了事实表单现在已填充
之后,使用之前的 management_form 创建字段。
return mark_safe('\n'.join([six.text_type(self.management_form), forms]))
form in self
导致调用特殊方法 self.__iter__()
,这就是在 python 中实现可迭代 类 的方式。
This method is called when an iterator is required for a container. This method should return a new iterator object that can iterate over all the objects in the container. For mappings, it should iterate over the keys of the container.
对于django的formsets,这是相关的代码。
class BaseFormSet(object):
"""
A collection of instances of the same Form class.
"""
def __iter__(self):
"""Yields the forms in the order they should be rendered"""
return iter(self.forms)
@cached_property
def forms(self):
"""
Instantiate forms at first property access.
"""
# DoS protection is included in total_form_count()
forms = [self._construct_form(i, **self.get_form_kwargs(i))
for i in range(self.total_form_count())]
return forms