【Django入門8】フォームの作成とデータ送信の仕組み|ユーザー入力を受け取る方法

フォームの基本

フォームとは?

フォームは、ユーザーからの入力を受け取り、サーバーに送信するためのインターフェースです。例えば、ユーザー登録、ログイン、コメント投稿などがフォームを使った典型的な操作です。

なぜフォームが重要なのか?

  • ユーザーとのインタラクション: フォームを通じてユーザーからの情報を収集できます。
  • 安全なデータ送信: Djangoのフォーム機能を使えば、バリデーション(入力チェック)やセキュリティ機能が標準で備わっています。

Djangoでのフォーム作成

フォームの作成手順

  1. フォームクラスの作成: forms.pyファイルにフォームクラスを定義します。
  2. ビューでフォームを処理: ユーザーからの入力データを受け取って処理します。
  3. テンプレートでフォームを表示: フォームをHTML上に表示します。

フォームクラスの作成

まず、アプリケーション内にforms.pyというファイルを作成し、フォームクラスを定義します。

例: ユーザー情報を入力するフォーム

from django import forms

class UserForm(forms.Form):
    name = forms.CharField(label='名前', max_length=100)
    email = forms.EmailField(label='メールアドレス')
    age = forms.IntegerField(label='年齢')
  • CharField: 文字列を入力するフィールド。
  • EmailField: メールアドレス形式をバリデーションするフィールド。
  • IntegerField: 数値のみを受け付けるフィールド。

ビューでのフォームの処理

ビュー関数の作成

フォームデータを受け取り、バリデーションを行うためにビューを定義します。

例: フォームの表示と送信データの処理

from django.shortcuts import render
from .forms import UserForm

def user_input(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            # フォームが有効な場合、データを取得して処理
            name = form.cleaned_data['name']
            email = form.cleaned_data['email']
            age = form.cleaned_data['age']
            return render(request, 'success.html', {'name': name})
    else:
        form = UserForm()
    return render(request, 'user_form.html', {'form': form})
  • request.method == 'POST': POSTリクエストが送信された場合に処理を実行。
  • form.is_valid(): 入力データが有効であるかをチェック。
  • form.cleaned_data: バリデーションが成功したデータを取得。

テンプレートでフォームを表示

HTMLテンプレートの作成

フォームをユーザーに表示し、入力を受け取るためのHTMLテンプレートを作成します。

例: user_form.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ユーザー情報の入力</title>
</head>
<body>
    <h1>ユーザー情報を入力してください</h1>
    <form method="POST">
        {% csrf_token %}  <!-- セキュリティトークンの埋め込み -->
        {{ form.as_p }}  <!-- フォームフィールドをパラグラフ形式で表示 -->
        <input type="submit" value="送信">
    </form>
</body>
</html>
  • {% csrf_token %}: クロスサイトリクエストフォージェリ(CSRF)攻撃を防ぐためのトークン。
  • {{ form.as_p }}: フォームの各フィールドをHTMLの段落形式で表示します。

フォームのバリデーションとエラーメッセージ

バリデーションの仕組み

Djangoは、フォームフィールドごとに標準のバリデーションを提供します。たとえば、EmailFieldは正しいメールアドレス形式かを自動でチェックします。

例: 無効な入力時のエラーメッセージ

if form.is_valid():
    # 正常な処理
else:
    print(form.errors)  # フィールドごとのエラー情報を表示

カスタムバリデーションの追加

必要に応じて、カスタムバリデーションを追加することも可能です。

例: 年齢が18歳以上であるかをチェックするバリデーション

from django import forms

class UserForm(forms.Form):
    name = forms.CharField(label='名前', max_length=100)
    age = forms.IntegerField(label='年齢')

    def clean_age(self):
        age = self.cleaned_data['age']
        if age < 18:
            raise forms.ValidationError('18歳以上である必要があります。')
        return age

フォーム送信後の処理

データベースへの保存

フォームから送信されたデータをデータベースに保存するには、モデルと連携する必要があります。

例: データの保存

from django.shortcuts import render
from .forms import UserForm
from .models import User

def user_input(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            # データベースに保存
            User.objects.create(
                name=form.cleaned_data['name'],
                email=form.cleaned_data['email'],
                age=form.cleaned_data['age']
            )
            return render(request, 'success.html')
    else:
        form = UserForm()
    return render(request, 'user_form.html', {'form': form})

フォーム送信後のリダイレクト

フォーム送信後に別のページへリダイレクトする場合、HttpResponseRedirectを使用します。

例:

from django.http import HttpResponseRedirect

def user_input(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            # データを保存し、成功ページにリダイレクト
            return HttpResponseRedirect('/success/')

まとめ

Djangoのフォーム機能を使えば、ユーザーからの入力を簡単に受け取り、データベースに保存するなどの処理を効率よく行えます。ビュー、テンプレート、フォームクラスの連携を理解することで、ユーザーインターフェースを伴ったWebアプリケーションを構築する基礎が身に付きます。