Koki's personal blog

Koki's personal blog

Another fine, responsive site template by HTML5 UP.

Djangoで複数ModelのFormをページ上で1つのFormとして扱う

この記事では、Djangoで複数ModelのFormをページ上で1つのFormとして扱う方法を説明します。

Koki

2 分で読めます

この記事では、Djangoで複数ModelのFormを1つのFormとして扱う方法を説明します。

この記事の内容です。

対象読者

  • Djangoで複数ModelのFormをページ上で1つのFormとして扱いたい方

環境

  • Django (version 4.1.2, 3.2.16)

前提条件

なし

複数モデルのFormをページ上で1つのFormとして扱う方法

以降のサンプルコードでは、Hoge, Fugaモデルをページ上で1つのFormとして扱っています。
各モデルやクラス名は、使用したいものに置き換えてお使いください。

1. 各モデルのFormクラスを作成

from django import forms

from .models import Hoge, Fuga


class HogeForm(forms.ModelForm):
    class Meta:
        model = Hoge


class FugaForm(forms.ModelForm):
    class Meta:
        model = Fuga

2. Viewクラスを作成

from django.views.generic import TemplateView

from .forms import HogeForm, FugaForm


class TestView(TemplateView):
    template_name = 'test_form.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # ここでページ上に表示したいFormをcontextに設定する。
        context['hoge_form'] = HogeForm
        context['fuga_form'] = FugaForm

        return context


    def post(self, request, *args, **kwargs):
        # 送信されたデータを元に各フォームインスタンスを作成する。
        hoge_form = HogeForm(data=request.POST)
        fuga_form = FugaForm(data=request.POST)

        # 以降は、 Validationなり独自処理なりお好きにどうぞ。

3. Templateを作成

<html>
    <head>
        <title>テストフォームページ</title>
    </head>
    <body>
        <!-- formタグにnovalidateを設定しているのは、
             ValidationをすべてViewクラス側にて行いたいため。(余談) -->
        <form method="post" novalidate>
            {% csrf_token %}

            <!-- 1つのformタグ内で各Formをtableタグで囲むことで、
                 複数モデルをベースに作成した各Formのデータを送信できる。 -->
            <table>
                {{ hoge_form }}
            </table>

            <table>
                {{ fuga_form }}
            </table>

            <input type="submit" value="送信" onclick="this.disabled=true,this.form.submit();">
        </form>
    </body>
</html>

最近の投稿

カテゴリー