Djangoでのフォームコンポーネントの作り方【forms.py】

Djangoでのフォームコンポーネントの作り方【forms.py】


こんにちは、えびかずきです。

この記事では、
Djangoプロジェクトの『フォーム』コンポーネントの作り方を簡単に説明します。

筆者えびかずきの得意分野は機械学習ですが、
最近Web開発を勉強中なので、備忘録的に記事を残しておこうと思います。

開発環境

OS:MacOS Catalina 10.15
Python:3.7.3
Django:2.2.2

フォームコンポーネントの役割

フォームコンポーネントは、Webアプリのお問い合わせ画面にあるような入力フォームの設置に関係するコンポーネントです。


入力フォームから受けた値を、フォームオブジェクトに変換し、必要に応じてはその値が適切かどうかを判断(バリデーション)し、値を保持する役割があります。


そしてこのフォームコンポーネントは、『forms.py』で実装します。

forms.pyの設置場所

『forms.py』ファイルはアプリケーション作成時にデフォルトで生成されませんので、必要に応じて自分で作成して設置する必要があります。

設置場所は下図のとおり。

アプリケーションフォルダの直下に設置します。

forms.pyのコードの書き方

フォームの定義は、
Djangoが用意しているフォーム関連の親クラスを継承しておこないます。

継承する親クラスは以下の二つです。


django.forms.Form:
いつでも使える基本的なフォームクラス


django.forms.ModelForm:
紐づけるフォーム画面のフィールドがモデルと同じ場合に使えるフォームクラス


django.forms.Formを継承する場合

django.forms.Formを継承する場合の基本的なフォームクラスの作り方は以下のとおりです。

#django.forms.Formを継承する場合

class フォーム名(django.forms.Form):

    [フィールド変数1の定義]
    [フィールド変数2の定義]
             ・
             ・

親クラスとして『django.forms.Form』を継承してフォームを定義し、一つ一つのフィールドを定義していきます。

実際のコード例は以下のとおりです。

#django.forms.Formを継承する場合の例

from django import forms

class InquiryForm(forms.Form):
    name = forms.CharField(label='お名前')
    email = forms.EmailField(label='メールアドレス') 

ここでは、『InquiryForm(お問い合わせフォーム)』というフォームクラスを定義しています。

さらにフォームの構成要素となるフィールド変数として、デフォルトで用意されているフィールドクラスを使って『name』,『email』というフィールドを定義しています。

代表的なフィールドクラス

代表的なフィールドクラスとして、以下のようなものがあります。

フィールドクラス説明
CharField文字列のフィールド
IntegerField整数のフィールド
ChoiceField選択のフィールド
DateField日付のフィールド
DateTimeField日付と時間のフィールド
EmailFieldメールアドレスのフィールド
FileFieldファイルのフィールド
ImageField画像のフィールド

フィールドオプションについて:
下のようにフィールドの引数を指定することで設定を変更することができます。
CharFields(label=”ラベル名”,widget=forms.textarea)

代表的なフィールドオプションには以下のようなものがあります。

required:必須フィールドにするかどうか(True or False)
label:ラベル名を設定
widget:デザインを変更
validators:バリデータを設定

参考:Django2.2/Form fields


django.forms.ModelFormを継承する場合

django.forms.ModelFormを継承する場合の基本的なフォームクラスの作り方は以下のとおりです。

#django.forms.ModelFormを継承する場合

class フォーム名(django.forms.ModelForm):

    class Meta:
        model = 作成済みのモデルクラス
        fields = ('フィールド名1','フィールド名2',・・・) 

親クラスとして『django.forms.ModelForm』を継承してフォームを定義し、Meta情報を設定してやります。

作成済みのモデルで既にフィールド情報は存在しているので、ここではメタ情報として、フォームで使用するフィールド名を指定するだけでOKです。


コード中のclass Metaは何か?:
親クラスの『forms.ModelForm』にはメタクラスが指定されていて、普通のクラスとは異なる機能が付与されている。
その機能とは子クラス作成時に『class Meta:』でクラス変数に何らかのオブジェクトを紐づけることで、それに応じた子クラスが作られるというもの(と私は理解していますが、もし間違いあれば連絡ください)。

https://github.com/django/django/blob/c494d90c195a739a7298b073eaa6ed987c2fd0bc/django/forms/models.py#L469

参考:メタクラスとは何なのでしょうか?


実際のコード例は以下のとおりです。

コードの実質的な内容はdjango.forms.Formを継承する場合の例と同じです。

#django.forms.ModelFormを継承する場合の例

from django import forms
from .models import Inquiry

class InquiryForm(forms.ModelForm):
    class Meta:
        model = Inquiry
        fields = ('name','email')

まとめ

今回はDjangoプロジェクトのフォームコンポーネントの作り方について簡単に説明しました。

Webアプリを作る際には、ログイン画面などユーザーからの入力を受け取るページに必須のコンポーネントですので、しっかりマスターしておきたいですね。

ではまた次回!

参考書籍

この記事は下の書籍を参考にさせていただきました。

動かして学ぶ!Python Django開発入門(kindle版)

Djangoカテゴリの最新記事