フォームの基本
フォームとは?
フォームは、ユーザーからの入力を受け取り、サーバーに送信するためのインターフェースです。例えば、ユーザー登録、ログイン、コメント投稿などがフォームを使った典型的な操作です。
なぜフォームが重要なのか?
- ユーザーとのインタラクション: フォームを通じてユーザーからの情報を収集できます。
- 安全なデータ送信: Djangoのフォーム機能を使えば、バリデーション(入力チェック)やセキュリティ機能が標準で備わっています。
Djangoでのフォーム作成
フォームの作成手順
- フォームクラスの作成:
forms.py
ファイルにフォームクラスを定義します。 - ビューでフォームを処理: ユーザーからの入力データを受け取って処理します。
- テンプレートでフォームを表示: フォームを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アプリケーションを構築する基礎が身に付きます。