2017-08-30 50 views
1

我试图理解Django表单集的内部是如何工作的。Django和表单集

一个formset类后,通过formset_factory函数创建,继承/从BaseFormSet,新创建的类的一个对象被初始化,例如获得属性:

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) 

为什么自我,我不明白,因为基于目录()形式就是一个类,自我是该formset对象。背后的逻辑是什么?

(PS我明白了什么是做打算每一种形式),但形式不形成,除了事实的形式现在被填充

而在此之后,使用management_form之前创建的领域。

return mark_safe('\n'.join([six.text_type(self.management_form), forms])) 

回答

2

form in self导致的特殊方法self.__iter__(),这是类如何迭代在Python实现通话。

object.__iter__(self)

当需要一种用于容器的迭代该方法被调用。这个方法应该返回一个新的迭代器对象,它可以迭代容器中的所有对象。对于映射,它应该迭代容器的键。

对于django的表单集,这是相关的代码。

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 

link to full source