0

OrganizationsCreateViewモデル フォームにアタッチされたフォームセットをそのフォームのインスタンス変数として含むクラス ベースのビューがあります。これは、ユーザーがデータを入力すると正常に機能します。新しいオブジェクトが正常に作成されます。ユーザーがフォームセットに行を追加したい場合、CreateView の post メソッドで条件をトリガーする送信ボタンがあります。

def post(self,request,*args,**kwargs):
    if 'add_email' in request.POST:

        cp = request.POST.copy()
        cp['emails-TOTAL_FORMS'] = int(request.POST['emails-TOTAL_FORMS']) + 1
        self.initial_emails = cp

    return super(OrganizationsCreateView,self).post(request,*args,**kwargs)

これにより行が追加されますが、残念ながら、ユーザーが新しい行を追加するたびに新しいオブジェクトも追加されます。このオブジェクトの追加動作をどのように/どこで短絡する必要がありますか?

4

1 に答える 1

1

Django のクラスベースのビューの応答フローを調べた後、私が使用している post メソッドを次に示します。

def post(self,request,*args,**kwargs):
    if 'add_email' in request.POST:
        # Set the object like BaseCreateView would normally do
        self.object = None

        # Copy the form data so that we retain it after adding a new row
        cp = request.POST.copy()
        cp['emails-TOTAL_FORMS'] = int(request.POST['emails-TOTAL_FORMS']) + 1
        self.initial_emails = cp

        # Perform steps similar to ProcessFormView
        form_class = self.get_form_class()
        form = self.get_form(form_class)

        # Render a response identical to what would be rendered if the form was invalid
        return self.render_to_response(self.get_context_data(form=form))

    return super(OrganizationsCreateView,self).post(request,*args,**kwargs)

もう 1 つの重要な部分はget_form_kwargsメソッドです。

def get_form_kwargs(self):
    kwargs = super(OrganizationsCreateView,self).get_form_kwargs()
    kwargs['initial_emails'] = self.initial_emails
    return kwargs
于 2012-10-16T00:33:13.413 に答える