Django ModelFormで編集フォームを作る方法をやさしく解説|既存データの更新処理入門
生徒
「Djangoで、すでに登録されているデータを編集する画面って、どうやって作るんですか?」
先生
「Djangoでは、ModelFormを使うと、編集フォームもとても簡単に作れます。データベースの内容を、そのまま画面に表示して変更できます。」
生徒
「パソコンをほとんど触ったことがなくても大丈夫ですか?」
先生
「大丈夫です。ノートに書いた内容を書き直すような感覚で考えると、すぐに理解できますよ。」
1. Django ModelFormとは何かを超かんたんに理解しよう
DjangoのModelFormとは、データベースの設計図である「モデル」から、自動で入力フォームを作ってくれる便利な仕組みです。ふつう、入力画面を作るには項目を一つずつ書く必要がありますが、ModelFormを使うと、その手間が大きく減ります。
初心者の方は、「ModelForm=紙の申込書を自動で作ってくれる機械」と考えてください。しかも、その申込書は、すでに書かれている内容を表示して、書き直すこともできます。これが編集フォームです。
2. 編集フォームで必要になる既存データ更新の考え方
既存データの更新とは、すでに保存されている情報を書き換えることです。たとえば、名前やメールアドレスを登録したあとに、「間違えたから直したい」という場面を想像してください。
Djangoでは、「どのデータを直すのか」を指定し、そのデータをフォームに表示してから、変更した内容を保存します。この流れを理解すれば、編集処理は怖くありません。
3. 例として使うシンプルなモデルを確認しよう
まずは、とても単純なモデルを使って説明します。ここでは、名前と年齢を保存するモデルを用意します。モデルとは、データベースの中身を決める設計図のことです。
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=50)
age = models.IntegerField()
def __str__(self):
return self.name
このモデルは、「名前」と「年齢」という二つの情報を保存します。とてもシンプルなので、初心者の方でも安心して読めます。
4. ModelFormを使って編集用フォームを作る方法
次に、ModelFormを使ってフォームを作ります。フォームとは、画面に表示される入力欄のことです。ModelFormでは、どのモデルを使うかを指定するだけでOKです。
from django import forms
from .models import Person
class PersonForm(forms.ModelForm):
class Meta:
model = Person
fields = ['name', 'age']
ここでは、「Personモデルを使います」「名前と年齢をフォームに出します」と書いています。難しい英単語が出てきますが、今は「モデルとフォームをつなげている」と理解すれば十分です。
5. ビューで既存データを読み込んで編集する
ビューとは、画面表示や処理の流れをまとめた場所です。編集フォームでは、「どの人のデータを編集するか」を指定して、その情報をフォームに入れます。
from django.shortcuts import render, get_object_or_404, redirect
from .models import Person
from .forms import PersonForm
def edit_person(request, person_id):
person = get_object_or_404(Person, id=person_id)
if request.method == 'POST':
form = PersonForm(request.POST, instance=person)
if form.is_valid():
form.save()
return redirect('person_detail', person_id=person.id)
else:
form = PersonForm(instance=person)
return render(request, 'edit_person.html', {'form': form})
instanceとは、「このデータ本人」という意味です。ここでは、「この人の情報をフォームに入れてね」とDjangoに伝えています。
6. テンプレートで編集フォームを表示する
テンプレートは、実際に画面に見えるHTMLです。編集フォームも、基本は新規作成と同じで、とてもシンプルに書けます。
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary">更新する</button>
</form>
ボタンを押すと、入力した内容でデータが上書き保存されます。ノートの文字を書き直す感覚と同じです。
7. 編集処理でよくある失敗と注意点
初心者の方がよくつまずくのは、「instanceを書き忘れる」ことです。これを忘れると、新しいデータが作られてしまいます。必ず「どのデータを編集するか」を指定しましょう。
また、URLでIDを受け取ることで、「この人の情報」という目印をDjangoに渡しています。これは、名札を見て本人を確認するイメージです。
8. Django ModelForm編集処理の全体の流れを整理
Django ModelFormを使った編集フォームは、「モデルを用意する」「ModelFormを作る」「ビューで既存データを読み込む」「テンプレートで表示する」という流れです。
この仕組みを理解すると、Djangoでのデータ更新処理が一気に楽になります。初心者の方でも、少しずつ手を動かせば、必ず理解できます。
まとめ
この記事では、DjangoのModelFormを使って既存データを編集し、更新する方法について、初心者の方でも理解できるように順を追って解説してきました。ModelFormは、Djangoの中でも特に便利な仕組みで、データベースの設計図であるモデルをもとに、入力フォームや編集フォームを自動で作ってくれます。これにより、フォームの項目を一つひとつ手作業で書く必要がなくなり、コード量も減り、ミスも起きにくくなります。
編集フォームの最大のポイントは、「すでに存在するデータをフォームに表示して、その内容を上書き保存する」という考え方です。Djangoでは、この仕組みを instance という指定で実現します。ビューの中で、どのデータを編集するのかを明確にし、そのデータをModelFormに渡すことで、画面には最初から値が入った状態のフォームが表示されます。これは、ノートに書いた文字を消して書き直す感覚にとても近く、初心者の方でもイメージしやすい流れです。
また、POSTリクエストとGETリクエストの役割の違いも重要でした。GETのときは、編集画面を表示するために既存データをフォームへ入れ、POSTのときは、送信された内容をチェックして正しければ保存します。この「表示」と「保存」の役割分担を理解することで、Djangoのフォーム処理全体が整理されて見えるようになります。
テンプレート側では、特別に難しいことをする必要はありません。{{ form.as_p }} を使えば、ModelFormで定義した項目が自動的にHTMLとして表示されます。CSRFトークンを忘れずに書き、送信ボタンを用意すれば、編集フォームとして十分に機能します。HTMLやCSSにまだ慣れていない方でも、最低限の記述で動く点は、Djangoの大きな魅力です。
よくある失敗として、「instanceを指定しなかったために新規データが作成されてしまう」という点も確認しました。編集処理では、必ず「どのデータを対象にするのか」を意識することが大切です。URLからIDを受け取り、そのIDを使ってデータを取得し、ModelFormに渡す。この流れを毎回意識することで、意図しない動作を防げます。
DjangoのModelFormを使った編集処理は、Webアプリケーション開発の中でも非常によく使われる基本機能です。ユーザー情報の変更、商品情報の更新、投稿内容の修正など、さまざまな場面で応用できます。今回学んだ内容をしっかり身につけておくことで、Djangoを使った開発の幅が大きく広がります。
編集処理のサンプルコード振り返り
def edit_person(request, person_id):
person = get_object_or_404(Person, id=person_id)
if request.method == 'POST':
form = PersonForm(request.POST, instance=person)
if form.is_valid():
form.save()
return redirect('person_detail', person_id=person.id)
else:
form = PersonForm(instance=person)
return render(request, 'edit_person.html', {'form': form})
このコードでは、まず編集対象となるデータを取得し、そのデータを instance としてフォームに渡しています。POST時には送信内容をチェックし、問題がなければ保存する、という非常に分かりやすい構造になっています。初心者の方は、この形をそのまま覚えてしまっても問題ありません。
生徒
「ModelFormを使うと、編集画面ってこんなに簡単に作れるんですね。最初は難しそうだと思っていました。」
先生
「そう感じる人は多いですよ。でも、ModelFormは初心者のために用意されている仕組みとも言えます。モデルを理解できていれば、フォームも自然に作れます。」
生徒
「instanceを指定するのが大事なんですね。これを書き忘れると新しくデータが増えてしまうのが、やっと分かりました。」
先生
「その理解はとても大切です。編集なのか、新規作成なのかは、instanceがあるかどうかで決まります。」
生徒
「GETは表示、POSTは保存、という流れも整理できました。今まで何となく書いていた部分が、ちゃんと意味を持って見えます。」
先生
「その調子です。意味を理解しながら書けるようになると、Djangoは一気に楽しくなりますよ。次は一覧画面や削除処理にも挑戦してみましょう。」