Djangoで複数ModelのFormをページ上で1つのFormとして扱う
この記事では、Djangoで複数ModelのFormをページ上で1つのFormとして扱う方法を説明します。
この記事では、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>