Djangoのformの今どきな作り方【Python, モデルフォーム】
- 作成日: 2020-12-03
- 更新日: 2023-12-26
- カテゴリ: Django
Djangoのフォームの作り方
PythonのWebフレームワークである「Django(ジャンゴ)」を使うと簡単にWebアプリを作れます。
Webアプリにはユーザーからの入力を受け付けるフォームがあるのが普通です。
Djangoにも他のWebフレームワークの例にもれずフォームを作るための仕組みがあります。
この記事では今どきなDjangoのフォームの作り方を解説します。
具体的には↓を見ていきます。
- フォームとは?
- フォームの必要性
- forms.pyの作成
- モデルの定義
- モデルからフォームを作成する
フォームとは?
Webアプリケーションにおけるフォームとは、ユーザーからの入力を受け付け処理する部品のことです。
この部品はHTMLで記述されます。
HTMLにはform
やinput
などのタグがあり、これらのタグを使うことでフォームを書くことが出来ます。
その内容は↓のようなものです。
<form action="/" method="POST">
<div>
<label>名前:</label>
<input name="name" type="text" />
</div>
<div>
<label>内容:</label>
<textarea name="content"></textarea>
</div>
<button type="submit">送信</button>
</form>
form
の仕事は入力された内容をデータとして、特定のページにリクエストを送信することです。
↑のフォームの場合、/
に対してPOST
リクエストが送られます。
フォームの必要性
フォームは必要でしょうか?
それは場合によります。
制作しているWebアプリケーションがユーザーからの入力を必要とする場合は、ほとんどの場合フォームが必要です。
動的なWebアプリケーションにおいて、フォームは無くてはならないものです。
たとえば掲示板の場合を考えてみます。
掲示板はユーザーの投稿内容をサイトに表示します。
ユーザーは掲示板にどのように投稿をするのかと言うと、フォームを通じて投稿を行います。
フォームは特定のページにリクエストを行います。
そのリクエストの時に、ユーザーの入力データをいっしょに送ります。
サーバーではその入力データをバリデーションして、場合によってはデータベースを操作します。
動的なWebアプリケーションにおいてフォームはありふれたものです。
そのためWebフレームワークではこのフォームを簡単に作成できる仕組みを提供しています。
Djangoではその仕組みをdjango.forms
が提供します。
forms.pyの作成
Djangoでフォームを作成するには、まず最初に自作のフォームを書いておくモジュールを作ります。
慣例的にこのモジュールはforms.py
で作成されます。
forms.py
はアプリケーションの直下に置かれます。
たとえばpython manage.py startapp myapp
でmyapp
というアプリケーションを作成したとします。
その場合、forms.py
はmyapp/forms.py
に作成します。
モデルの定義
Djangoのフォームはモデルと連携を取ることが可能になっています。
そのため最初にモデルを作っておきましょう。
今回は掲示板アプリケーションを想定します。
掲示板への投稿内容をPost
というモデルで表現することにします。
Post
には投稿者名を表すname
と、投稿内容を表すcontent
のフィールドを作ります。
from django.db import models
class Post(models.Model):
name = models.CharField(max_length=64, help_text='投稿者名')
content = models.TextField(max_length=512, help_text='投稿内容')
このモデルをフォームで扱ってみたいと思います。
モデルからフォームを作成する
Djangoにはさきほど作成したフォームと密接に連携を行うフォームがあります。
それがdjango.forms.ModelForm
です。
このフォームを使うと、フォームにモデルの部品を流用することが可能です。
forms.py
にPostForm
を作ってみます。
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('name', 'content')
PostForm
はクラスです。
これはdjango.forms.ModelForm
を継承します。
こうすることで自作のモデルフォームを作ることが出来ます。
モデルフォームにはMeta
という属性をclass
で作ります。
その中の属性model
にフォームと連携させたいモデルを指定します。
ここではmodels.Post
がそれです。
さらにfields
属性にフォーム上で表示させたいフィールド名をタプルで指定します。
↑の例ではmodels.Post
のフィールドname
とcontent
をフォームで表示させるようにしています。
ビューのコンテキストにフォームを設定する
先ほど作成したPostForm
をビューで使いたい場合はforms.py
からPostForm
をインポートします。
そしてコンテキストにPostForm
をオブジェクトにして代入します。
from django.shortcuts import render
from .forms import PostForm
def home_view(request):
context = {}
context['form'] = PostForm() # <- フォームの代入
return render(request, 'myapp/home.html', context)
こうすることでテンプレートファイルからフォームを使えるようになります。
↑の場合、テンプレートからフォームを使いたい場合はform
変数を参照します。
テンプレートでフォームを描画する
先ほど設定したコンテキストを使い、テンプレートでフォームを描画するには、↓のようにform
変数を参照します。
<form action="/create/" method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">送信</button>
</form>
🦝 < え! `