こんにちは、えびかずきです。
この記事では、
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:バリデータを設定
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:』でクラス変数に何らかのオブジェクトを紐づけることで、それに応じた子クラスが作られるというもの(と私は理解していますが、もし間違いあれば連絡ください)。
実際のコード例は以下のとおりです。
コードの実質的な内容は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アプリを作る際には、ログイン画面などユーザーからの入力を受け取るページに必須のコンポーネントですので、しっかりマスターしておきたいですね。
ではまた次回!
参考書籍
この記事は下の書籍を参考にさせていただきました。
コメントを書く