0

オブジェクト クエリによって返されるモデル インスタンスごとに 1 つずつ、多数のフォームを表示するビューを作成したいと考えています。そうすれば、ユーザーは一度に複数のフォームに入力でき、すべてのオブジェクトのデータが に保存されPOSTます。ここに私が持っているものがあります:

意見:

def formView(request, attr):
     object_list = MyModel.objects.filter(attribute1=attr)
     if request.method == 'POST':
          form_list = [MyModelForm(request.POST, instance=x) for x in object_list]
          if all(form.is_valid for form in form_list):
              for form in form_list:
                  form.save()
              return HttpResponseRedirect('/thanks/')
     else:
          form_list = [MyModelForm(instance=x) for x in object_list]
     return render(request, 'formView.html', {'form_list':form_list})

HTML:

    <table>
        <thead>
            <tr>
                <th>Field1</th>
                <th>Field2</th>
                <th>Field3</th>
            </tr>
        </thead>
        <tbody>
            {% for form in form_list %}
            <tr>
                <form method="post">{% csrf_token %}
                {% for field in form %}
                <td>{{ field }}</td>
                {% endfor %}
                <td><input type="submit" value="Submit" /></td>
                </form>
            </tr>
            {% endfor %}
        </tbody>
    </table>

間違っている場合は訂正してください。ただし、私のコードが現在行っていることは次のとおりです。ユーザーがページ上のフォームに入力してボタンの 1 つをクリックすると、Submitそのボタンに対応するフォームはSubmitそのデータのみをビューに送信します。 、次にそのデータを のすべてのフォームに保存しform_list、データベース内の対応するすべてのオブジェクトに同じデータを書き込みます (これは明らかに私が望んでいることではありません)。

私が望むのはSubmit、ページ全体の単一のボタンのようなものです。これにより、ページ内の各フォームのデータが関連するフォームと共に返され、データベース内の適切な対応するオブジェクトに保存されます。これは可能ですか?

4

2 に答える 2

3

モデルに関連付けられた FormSet を試しましたか? 編集するオブジェクトを選択するクエリを定義すると、Django が (ほとんど) すべてを処理します。 https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#changeing-the-queryset

アプローチ (ページごとに複数のフォーム、またはページごとに複数のフォームセット) を追求したい場合は、次のprefix属性を使用します: https://docs.djangoproject.com/en/dev/ref/forms/api/#subclassing-フォームを作成し、1 つのボタン<form>で 1 つのタグ のみを使用します。Submit

例: http://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-more-than-one-formset-in-a-view

于 2013-05-08T05:50:32.450 に答える
1

prefix各フォームが個別に識別されるように、フォームで使用してみてください。x.id接頭辞の方が良いでしょう。

何かのようなもの:

def formView(request, attr):
     object_list = MyModel.objects.filter(attribute1=attr)
     if request.method == 'POST':
          form_list = [MyModelForm(request.POST, instance=x, prefix=str(x.id)) for x in object_list]
          if all(form.is_valid for form in form_list):
              for form in form_list:
                  form.save()
              return HttpResponseRedirect('/thanks/')
     else:
          form_list = [MyModelForm(instance=x, prefix=str(x.id)) for x in object_list]
     return render(request, 'formView.html', {'form_list':form_list})
于 2013-05-08T05:53:13.100 に答える