Skip to content
Code Blue プログラミング学習ノート
Python/Django

Django 登録(Create)

学習目標

前回は、データベースに保存されているTodoを一覧表示する方法を学習しました。しかし現在では管理画面からしかTodoを登録できません。管理画面を使わずに実際のWebアプリケーションで、ユーザーがブラウザ上の入力フォームに必要な情報を入力し、その内容をデータベースへ保存する一般的な機能を作成します。

この章では、Todoを登録する画面を作成しながら、フォーム(Form)の作成方法、データを送信するPOSTリクエスト、そして不正な送信を防ぐためのCSRF対策について学習します。これらはWebアプリケーション開発で欠かせない基本技術です。学習を終えると、ブラウザからTodoを登録できるアプリケーションが完成します。

Formとは

**Form(フォーム)**とは、ユーザーがデータを入力し、Webサーバーへ送信するための仕組みです。Webアプリケーションでは、ユーザー登録やログイン、お問い合わせ、商品登録、Todo登録など、さまざまな場面で利用されています。

Form.py

forms.pyで作成したフォームはビュー(views.py)から利用し、テンプレートへ渡して画面に表示します。また、入力内容の検証(バリデーション)も自動で行われるため、不正なデータや未入力のチェックを簡単に実装できます。

from django import forms
from .models import Todo


class TodoForm(forms.ModelForm):
    class Meta:
        model = Todo
        fields = ["title"]

forms.ModelForm:データベースのモデルをもとにフォームを自動生成するクラスです。
class Meta:フォームの設定を記述するためのクラスです。
model = Todo:Todoモデルをフォームの元データとして使用します。
fields = ["title"]:フォームに表示する項目を指定します。

この例ではtitleのみ入力できるフォームになります。

Formタグ

HTMLでは、<form>タグを使用してフォームを作成し、その中に入力欄や送信ボタンを配置します。ユーザーが入力した内容は、ボタンを押すことでサーバーへ送信され、必要に応じてデータベースへ保存できます。

<form>
    <input type="text">
    <button>登録</button>
</form>

今回は、このフォームを作成し、ブラウザからTodoを登録できる機能を実装していきます。

POSTメソッド

フォームに入力したデータをデータベースへ保存するには、まずその内容をサーバーへ送信する必要があります。その際に利用するのがPOSTです。

POSTは、データをサーバーへ送信するためのHTTPメソッドで、新しいデータの登録や既存データの更新、パスワードの送信など、データを変更する処理で使用されます。

HTMLでは、<form method="POST">と指定することで、フォームの入力内容をPOSTで送信できます。送信されたデータはDjangoのビュー(View)が受け取り、必要な処理を行った後にデータベースへ保存します。POSTは、Webアプリケーションでデータを登録・更新する際の基本となる仕組みです。

ViewでPOSTを受け取る

フォームから送信されたデータは、Djangoのビュー(View)で受け取って処理します。まず、if request.method == "POST":と記述し、リクエストがPOSTで送信されたかどうかを確認します。

この条件が真であれば、フォームからデータが送信されたことを意味します。送信されたデータは、request.POSTを使って取得できます。例えば、request.POST["title"]と記述すると、フォームに入力されたタイトルを取得できます。

取得したデータをもとに新しいTodoを作成し、データベースへ保存することで、ブラウザからTodoを登録できるようになります。

CSRFとは

Djangoでフォームからデータを送信する場合は、CSRF(Cross Site Request Forgery)対策が必要です。CSRFとは、ユーザーがログインした状態を悪用し、本人の意思とは関係なくデータの登録や削除などを実行させる攻撃のことです。

Djangoでは、この攻撃を防ぐために、フォームへ特別な認証用トークンを埋め込みます。テンプレートでは、<form method="POST">の中に{% csrf_token %}を記述するだけでCSRF対策を行えます。

POSTでデータを送信するフォームでは、必ず{% csrf_token %}を追加してください。追加しない場合、Djangoはセキュリティ上の理由からリクエストを拒否し、データを受け付けません。

create()でTodoを登録する

フォームから受け取ったデータは、前回学習したDjangoのORMのcreate()メソッドを使ってデータベースへ保存できます。例えば、Todo.objects.create(title=title)と記述すると、新しいTodoが登録されます。

実際のアプリケーションでは、タイトルだけでなく、内容や期限、完了フラグなど複数の入力項目をフォームから受け取り、それぞれをモデルの項目に設定して保存します。

これにより、ブラウザで入力したデータを簡単にデータベースへ登録できるようになります。create()は、新しいレコードを追加するための基本的なメソッドであり、Djangoでデータを登録する際によく利用されます。

Todo追加画面を完成させる

ここまで学習した内容を組み合わせると、Todo追加画面が完成します。

Todoを登録する処理は、いくつかの手順を順番に実行することで行われます。まず、ユーザーがブラウザのフォームへタイトルや内容などを入力し、登録ボタンを押します。すると、入力されたデータがPOSTメソッドを利用してサーバーへ送信されます。

次に、Djangoのビュー(View)がPOSTで送信されたデータを受け取り、必要な処理を行います。その後、ORMのcreate()メソッドを使用して新しいTodoを作成し、データベースへ保存します。

この一連の流れにより、ブラウザから入力したデータをデータベースへ登録できるようになります。これで、管理画面を使わなくてもWebページからTodoを登録できるようになります。

登録処理の流れ

Todoを登録するまでの流れをまとめると、次のようになります。

ブラウザ
    ↓
Formへ入力
    ↓
POST送信
    ↓
View
    ↓
request.POST
    ↓
Todo.objects.create()
    ↓
データベースへ保存

この流れは、ユーザー登録やお問い合わせフォームなど、多くのWebアプリケーションでも共通して利用されています。

まとめ

今回は、フォームからデータを登録する方法を学習しました。

この章では、ブラウザからデータを登録するための基本的な仕組みを学習しました。Formはユーザーからデータを入力してもらうための画面であり、入力内容はPOSTを利用してサーバーへ送信します。

Viewではrequest.methodを使ってPOSTリクエストかどうかを判定し、request.POSTからフォームの入力内容を取得できます。取得したデータは、ORMのcreate()メソッドを利用することでデータベースへ保存できます。

また、POSTを利用するフォームでは、不正なリクエストを防ぐために{% csrf_token %}を必ず記述する必要があります。これらは、Djangoでデータを登録する際の基本となる重要な知識です。

ここまでで、ユーザーがブラウザから入力したTodoをデータベースへ保存できるようになりました。次回は、登録したTodoの内容を編集し、既存のデータを更新する方法を学習していきます。