はじめに
Djangoは強力なWebフレームワークであり、フォームの処理も非常に簡潔に行えます。その中でも特に便利なのがModelForm。これはモデルとフォームを自動的に結びつける仕組みで、フォーム作成の手間を大幅に減らしてくれます。
この記事では、ModelFormの基本から実践的な使い方、よくあるエラーへの対処法までを丁寧に解説します。
基本的な使い方
モデルの定義
まずはmodels.pyでモデルを定義します。例として、簡単なブログの投稿モデルを作ります。
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
body = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
ModelFormの作成
次に、上記モデルに基づいたフォームをforms.pyで作成します。
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'body']
Metaクラスで、どのモデルを使うか(model)、どのフィールドを含めるか(fields)を指定します。
ビューでの利用
from django.shortcuts import render, redirect
from .forms import PostForm
def create_post(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
form.save()
return redirect('post_list')
else:
form = PostForm()
return render(request, 'create_post.html', {'form': form})
テンプレートとの連携
テンプレートでは以下のようにフォームを表示できます:
<!-- create_post.html -->
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">投稿</button>
</form>
実践例:簡単な投稿フォーム
上記のコードで、ユーザーが投稿できる機能を簡単に実装できます。form.save()は対応するモデルインスタンスを作成・保存します。
さらにフォームをカスタマイズしたい場合は次のように記述します。
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'body']
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control'}),
'body': forms.Textarea(attrs={'rows': 5, 'class': 'form-control'}),
}
カスタマイズ
フィールドの追加・除外
class PostForm(forms.ModelForm):
class Meta:
model = Post
exclude = ['created_at'] # 除外したい場合
独自バリデーション
clean_ メソッドを使って個別フィールドのバリデーションが可能です。
class PostForm(forms.ModelForm):
def clean_title(self):
title = self.cleaned_data['title']
if 'NG' in title:
raise forms.ValidationError("タイトルに不適切な語句が含まれています")
return title
よくあるエラーと対処法
form.save()で例外が出る:バリデーションに失敗しているか、フィールドが不足している可能性があります。
requiredなのにフォームに表示されない:ModelFormにフィールドを明示的に含めていない、またはテンプレートで表示していないことが原因です。
モデルとフォームのフィールド名がずれている:モデルの変更後は、ModelFormのMeta.fieldsを見直しましょう。
おわりに
ModelFormを使うことで、Djangoでのフォーム作成が非常に効率的になります。バリデーションやUIカスタマイズも簡単に行えるので、プロジェクトに取り入れていくことをおすすめします。
詳しくは公式ドキュメントも参照してみてください:
https://docs.djangoproject.com/ja/stable/topics/forms/modelforms/