2017-08-30 3 views
1

私はDjangoのフォームセットの内部がどのように動作するかを理解しようとします。Djangoとformsets

フォームセットクラスがBaseFormSetから属性を取得/継承し、formset_factory機能によって作成された後、新たに作成したクラスのオブジェクトが初期化され、例:

ArticleFormSet = formset_factory(ArticleFormA, extra=2) 
formset = ArticleFormSet() 

私はdir(formset)で両方のフォームをチェックして、属性を形成した場合利用可能であるが、私はforms何も印刷されない印刷しようとするならば、私はこれはforms属性に関連する一切の業務がないフォームセットオブジェクトの初期化にデコレータ@cached_property(ただし、呼び出されたとき?)

に関連していると仮定します。

{{formset}}や{{formset.as_p}}などが呼び出されたときに呼び出されるとします。

方法があります:

forms = ' '.join(form.as_p() for form in self) 

なぜ自己中、私は理解していない、()ディレクトリに基づいてフォームがちょうどクラスであり、かつ自己フォームセットオブジェクトであるためです。何が背後にあるロジックですか?

(私はすべてのフォームに行くやっているPS理解)が、実際の形は今

を移入され、その後、フィールドはその前にmanagement_formを使用して作成されているほか、フォームで形成されていません。 Pythonで実装されている方法を反復可能なクラスである特殊な方法self.__iter__()、への呼び出しで

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

答えて

2

form in self結果。

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

関連する問題