0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DjangoのModelForm入門:モデルとフォームの橋渡し

0
Posted at

はじめに

Djangoは強力なWebフレームワークであり、フォームの処理も非常に簡潔に行えます。その中でも特に便利なのがModelForm。これはモデルとフォームを自動的に結びつける仕組みで、フォーム作成の手間を大幅に減らしてくれます。

この記事では、ModelFormの基本から実践的な使い方、よくあるエラーへの対処法までを丁寧に解説します。

基本的な使い方

モデルの定義

まずはmodels.pyでモデルを定義します。例として、簡単なブログの投稿モデルを作ります。

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で作成します。

forms.py
from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'body']

Metaクラスで、どのモデルを使うか(model)、どのフィールドを含めるか(fields)を指定します。

ビューでの利用

views.py
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/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?