学習目標
前回は、フォームを利用して新しいTodoを登録する方法を学習しました。しかし、Webアプリケーションでは登録したデータを後から修正したい場面も多くあります。
例えば、タイトルや内容を変更したり、期限を更新したり、完了フラグを切り替えたりする場合です。この章では、登録済みのTodoを編集する機能を実装します。
編集処理では、既存のデータをフォームへ表示するためのinstance、送信されたデータを受け取るPOST、変更内容をデータベースへ保存するsave()メソッドについて学習します。この章を終えると、ブラウザから既存のTodoを編集できるようになります。
編集処理とは
編集処理とは、すでにデータベースへ保存されているデータの内容を変更する機能です。新規登録では新しいデータを追加しましたが、編集では既存のデータを更新します。
そのため、最初に編集したいTodoをデータベースから取得し、その内容をフォームへ表示する必要があります。ユーザーは表示された内容を修正し、送信ボタンを押すことで変更内容がサーバーへ送信されます。
その後、Djangoのビューで受け取ったデータをデータベースへ保存することで、既存のTodoの内容が更新されます。編集機能は、多くのWebアプリケーションで利用される基本的な機能の一つです。
instance
編集機能では、どのデータを変更するのかを指定する必要があります。その際に利用するのがinstanceです。instanceとは、データベースから取得した「編集対象となるModelのインスタンス」のことを指します。
例えば、Todo.objects.get(id=1)と記述すると、IDが1のTodoを取得でき、このtodoが編集対象のinstanceになります。新規登録では新しいデータを作成しますが、編集では取得したinstanceの内容を変更し、その変更を保存します。instanceを利用することで、目的のデータだけを正しく更新できるようになります。
編集画面を表示する
編集画面では、データベースから取得したinstanceの内容をフォームへ表示します。例えば、タイトルには現在のタイトル、内容には現在の内容、期限には現在の期限、完了フラグには現在の状態があらかじめ入力された状態で表示されます。
ユーザーは表示された内容を確認し、変更したい項目だけを修正して送信できます。編集画面で使用するフォームは新規登録とほぼ同じですが、入力欄に既存のデータが最初から表示されている点が大きな違いです。これにより、一から入力し直すことなく、必要な部分だけを効率よく更新できます。
POSTで更新内容を受け取る
編集画面でユーザーが内容を変更し、送信ボタンを押すと、フォームのデータはPOSTメソッドでサーバーへ送信されます。ビューでは、if request.method == “POST”:を使ってPOSTリクエストかどうかを確認し、request.POSTから入力されたデータを取得します。
この流れは、新規登録の処理とほぼ同じです。ただし、編集処理では新しいデータを作成するのではなく、あらかじめ取得しておいたinstanceの内容を書き換える点が異なります。取得した入力内容でinstanceを更新し、その変更をデータベースへ保存することで、既存のTodoの内容を編集できます。
save()で更新する
編集処理では、取得したinstanceの内容を変更した後に、save()メソッドを実行して変更内容をデータベースへ保存します。
例えば、todo.title = request.POST[“title”]やtodo.content = request.POST[“content”]のようにフォームから送信されたデータをinstanceへ設定し、最後にtodo.save()を実行すると、タイトルや内容が更新されます。
save()は、モデルの変更内容をデータベースへ反映するためのメソッドです。編集処理では、データを書き換えただけでは保存されないため、変更を確定するために必ずsave()を呼び出す必要があります。
create()との違い
前回学習したcreate()と今回のsave()は、どちらもデータベースへ保存するためのメソッドですが、役割が異なります。
| メソッド | 用途 |
|---|---|
| create() | 新しいデータを登録する |
| save() | 既存のデータを更新する |
例えば、次のような場面でcreate()とsave()を使い分けます。
create()を利用する場合(新規登録)
まだ存在しないTodoを新しく登録するときは、create()を使用します。例えば、「Pythonを勉強する」というTodoを新しく追加する場合は、次のように記述します。
Todo.objects.create(
title="Pythonを勉強する",
content="第5章まで学習する"
)
このコードを実行すると、新しいTodoがデータベースへ追加されます。
save()を利用する場合(編集)
すでに登録されているTodoの内容を変更するときは、save()を使用します。例えば、登録済みの「Pythonを勉強する」というTodoのタイトルを「Djangoを勉強する」へ変更する場合は、次のように記述します。
todo = Todo.objects.get(id=1)
todo.title = "Djangoを勉強する"
todo.save()
このコードでは、新しいTodoは追加されません。IDが1のTodoのタイトルだけが更新されます。このように、create()は新しいデータを追加するためのメソッド、save()は既存のデータの変更内容を保存するためのメソッドです。新規登録と編集では役割が異なるため、用途に応じて使い分けることが重要です。
編集画面を完成させる
ここまで学習した内容を組み合わせると、編集画面が完成します。
処理の流れは次のようになります。
- 編集したいTodoを取得する
- instanceをフォームへ表示する
- ユーザーが内容を変更する
- POSTで送信する
- ViewでPOSTデータを受け取る
- instanceを書き換える
save()でデータベースへ保存する
この流れが、Djangoで編集機能を実装する基本的な流れです。
編集処理の流れ
編集処理は、次のような順番で実行されます。
ブラウザ
↓
編集画面を表示
↓
Todoを取得
↓
instance
↓
フォームへ表示
↓
POST送信
↓
View
↓
instanceを書き換える
↓
save()
↓
データベース更新
新規登録と似ていますが、「既存のデータを取得してから更新する」という点が大きな違いです。
まとめ
今回は、登録済みのTodoを編集する方法を学習しました。
編集処理では、新しいデータを追加するのではなく、既存のデータを書き換えます。そのため、まず編集対象となるinstanceを取得し、その内容をフォームへ表示します。ユーザーが内容を変更して送信すると、POSTで送信されたデータをビューで受け取り、変更内容をinstanceへ反映します。
最後にsave()メソッドを実行することで、変更内容がデータベースへ保存されます。また、create()は新しいデータを登録するとき、save()は既存データを更新するときに利用するメソッドであり、それぞれの役割を理解して使い分けることが重要です。
ここまでで、Todoの登録と編集ができるようになりました。次回は、不要になったTodoを削除する方法を学習し、CRUD(作成・取得・更新・削除)の基本機能を完成させます。