Python | Django | “ModelFormSet”を利用した複数フォームの表示方法

2021年7月15日

公開日:2021/7/15

Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.

前記事にて,「“FormSet"を利用した複数フォームの表示方法」を記した.前記事での設定をそのまま引き継いだ上で,本記事では,「"ModelFormSet"を利用した複数フォームの表示方法」を以下にて記す.

◆実施環境

Python 3.8.8
Django 3.2.3

■ModelFormSet(モデルフォームセット)を利用した複数フォームの表示方法

ModelFormSet(モデルフォームセット)を利用すると複数のフォームを同じ画面に表示することができる.

“form_app/models.py"に追記し,以下のように編集する.

from django.db import models

class Bird(models.Model):
  birdname = models.CharField(max_length=50)
  title = models.CharField(max_length=100)
  review = models.CharField(max_length=300)
  author = models.CharField(max_length=50)

class ModelSetName(models.Model): # 以下追記箇所
  name = models.CharField(max_length=50)
  birthplace = models.CharField(max_length=50)

ターミナルを開き,”conda activate 仮想環境名”を実行し,仮想環境に移行する(移行方法の詳細はこちら)."cd form_project"を実行することによって,”form_project”のディレクトリに移動する.その後,”python manage.py makemigrations form_app”を実行すると,以下が出力される.

(djangoenv) C:\Users\shiro\Desktop\210517_python development\myformtest\form_project
>python manage.py makemigrations form_app

Migrations for 'form_app': # 以下出力箇所
  form_app\migrations\0002_modelsetname.py
    - Create model ModelSetName

続けて,"python manage.py migrate"を実行する."0002_modelsetname"が適用される.

(djangoenv) C:\Users\shiro\Desktop\210517_python development\myformtest\form_project
>python manage.py migrate

Operations to perform: # 以下出力箇所
  Apply all migrations: admin, auth, contenttypes, form_app, sessions
Running migrations:
  Applying form_app.0002_modelsetname... OK

以下のように,"form_app/migrations"に"0002_modelsetname.py"が作成された.

SQLiteをインストールし(詳細はこちら参照),"SQLITE EXPLORER"を開くと,"form_app_modelsetname"Tableを以下赤枠にて確認できる.

“form_app/views.py"を以下のように編集する.

from django.shortcuts import render
from django.forms import formset_factory, modelformset_factory
from . import forms
from .models import ModelSetName

def index(request):
  return render(request, 'form_temp/index.html')

def form_page(request):
  form = forms.ChocolateInfo()
  if request.method == 'POST':
    form = forms.ChocolateInfo(request.POST)
    if form.is_valid():
      print('submission is successful')
      print(form.cleaned_data)
    else:
      print('submission is failed')

  return render(
    request,'form_temp/form_page.html', context={
      'form':form
    }
  )

def form_bird(request):
  form = forms.BirdModelForm()
  if request.method == 'POST':
    form = forms.BirdModelForm(request.POST)
    if form.is_valid():
      form.save()
  return render(
    request, 'form_temp/form_bird.html', context={'form':form}
  )

def form_set_name(request):
  TestFormset = formset_factory(forms.FormSetName, extra=4)
  formset = TestFormset(request.POST or None) # 編集箇所(36~39行目)
  if formset.is_valid():
    for form in formset:
      print(form.cleaned_data)
  return render(
    request, 'form_temp/form_set_name.html',
    context = {'formset':formset}
  )

def modelform_set_name(request): # 以下追記箇所
  TestModelFormSet = modelformset_factory(ModelSetName, fields='__all__', extra=4)
  modelformset = TestModelFormSet(request.POST or None)
  if modelformset.is_valid():
    modelformset.save()
  return render(
    request, 'form_temp/modelform_set_name.html', 
    context={'modelformset':modelformset}
  )

“form_app/urls.py"に追記し,以下のように編集する.

from django. urls import path
from . import views

app_name = 'form_application'

urlpatterns = [
  path('', views.index, name='index'),
  path('form_page/', views.form_page, name='form_page'),
  path('form_bird/', views.form_bird, name='form_bird'),
  path('form_set_name/', views.form_set_name, name='form_set_name'),
  path('modelform_set_name/', views.modelform_set_name, name='modelform_set_name'), # 追記箇所
]

“form_project/templates/form_temp"に"modelform_set_name.html"を作成する.構成は以下のようになる.

“modelform_set_name.html"を以下のように編集する.

<!DOCTYPE html>
<html> 
<head> 
<meta charset="utf-8">
<title>Form</title> 
{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body> 
  <form method='POST'>
  {% csrf_token %}
  {{ modelformset.as_p }}
  <input type="submit" value="submit">
  </form>
</body> 
</html>

ターミナルを開き,"python manage.py runserver"を実行する.以下が出力される.

(djangoenv) C:\Users\shiro\Desktop\210517_python development\myformtest\form_project
>python manage.py runserver

System check identified no issues (0 silenced). # 以下出力箇所
July 15, 2021 - 16:37:49
Django version 3.2.3, using settings 'form_project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

“http://127.0.0.1:8000/"をクリックするとブラウザによって以下ページに遷移する.

“http://127.0.0.1:8000/form_application/modelform_set_name/"を入力すると,以下ページに遷移する.

4人分の入力箇所があるが,以下のように,3人分を入力し,"submit"をクリックする.

エラーはなく,"form_app_modelsetname"Tableを右クリックし,"Show Table"をクリックすると,以下のように"submit"された情報を確認できる.

    以上