0

数時間の捜索の後、私は負けたことを認めなければなりません。

Django のドキュメントを読みましたが、問題の解決策が本当に見つかりません。

次のコード行を検討してください。

EmploymentFormSet = inlineformset_factory(Profile, Employment, form=EmploymentForm, extra=3)

UpdateViewこのコードは、メソッドから継承し、さらにメソッド内のクラスベースのビューに存在しますget_context_data(self, *args, **kwargs):

inlineformset_factory が EmploymentFormSet を作成するため、これは非常に簡単です。

今これを考慮してください

queryset = Employment.objects.filter(profile__pk=self.kwargs['pk']).values()
context['emp_formset'] = EmploymentFormSet(prefix='emp_form', initial=queryset, auto_id=True)

initial=querysetバインドされていないインスタンス IIRC にのみ適用される を指定することで、クエリセットに含まれる数だけフォームセットに入力されると考えました。

したがって、私の場合、クエリセットは4を返しますEmploymentsが、パラメーターを使用するextraと、構築しているフォームセットには、このパラメーターが定義する数だけが入力されます。私の例では、エクストラを3つしか定義していないため、3つだけです。エクストラをインクリメントすると、フォームがインクリメンタルに読み込まれます。

のサブクラス化を試みましたBaseInlineFormSetが、実際には壁を突破していません。

私の質問は、クエリセットに含まれているのと同じ数のフォームをフォームセットに入力するにはどうすればよいかということです。私は正確な解決策を求めているわけではありませんが、正しい方向へのポインターです! :)

ありがとう!

4

2 に答える 2

0

このメソッドを構築して解決しました

def set_extra_forms(extra_forms, **kwargs):
    EmploymentFormSet = inlineformset_factory(Profile, Employment, form=EmploymentForm, extra=extra_forms)
    return EmploymentFormSet(**kwargs)

これが進むべき道だと私は信じていますが、コードをより動的にするためにコードをリファクタリングする必要があります。現在、1つのクラスと1つのクラスにのみ接続されていますが、魅力のように機能します。

于 2013-01-07T14:23:44.483 に答える