サイトアイコン ITC Media

【Django】Formに初期値を設定 4つの方法をまとめました

(最終更新月:2021年12月)

✔こんな方へ向けての記事となります

「Djangoのフォームで初期値を設定する方法がわからない!」

「方法がいくつかあるけど、どうやって使い分けるの?」

「表示するだけでなく、保存する方法も合わせて知りたい!」

✔当記事を通じて、解説していくことは下記の通りです

フォームへ値を渡すだけでなく、保存する方法まで実例を持ってご紹介します

フォームに値を渡し、受け取る、保存までの基本がマスターできます

筆者プロフィール

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Formに初期値を設定 4つの方法をまとめました

こちらでは、初期値を設定する方法を4つご説明します。

それぞれ特徴や使う場面が異なるので、すべて知っておくと良いでしょう。

モデルフィールドのdefaultへ値を格納

モデルクラス内の各フィールドで、初期値(default)を設定します

【例】

title = models.CharField(default=値,,,,)

※フォームで表示したい場合は、ModelFormを使っていないと表示されません。

ビュー関数内のフォームに引数として値を格納

  1. フォーム名をキー初期値を値とした辞書型のオブジェクトを作成
  2. フォームクラスの引数に作成したオブジェクトを渡す
  3. コンテキストでフォームクラスをHTMLテンプレートへ渡す

【例】

def 関数ベースビュー(request):
    ctx= {} #コンテキスト
    initial_values = {“フィールド1”: 値1, “フィールド2”: 値2,,,}
    form = フォームクラス(initial_values)
    ctx[“form”] = form
    #... その他の記述
    return render(request, テンプレート名, ctx)

具体例は3章でご紹介します

フォームフィールドの引数「initial」へ値を格納

モデルフィールドの場合と似ていますが、フォームフィールドでは「intiial」に値を格納します

【例】

フォームクラス内のフィールドで設定します

フィールド1 = forms.CharField(initial=値1,,,,)

フォームクラス __init__関数内でフィールドのinitial属性へ値を格納

  1. __init__メソッド内の「self.base_field」でフィールドにアクセス
  2. 各フィールドのinitial属性に値を格納します

【例】

def __init__(self, *args, **kwargs):
    self.base_fields[“フィールド名1”].initial = 値1
    super().__init__(*args, **kwargs)

4つの方法を使い分けよう!どんな場面で使うかを徹底解説!

モデルフィールドのデフォルト

ユーザーがブラウザから保存するだけでなく、Pythonコードで自動保存の機能などをもたせる場合、モデルフィールドでデフォルトを設定しておくと便利です

デフォルトを設定しているフィールドが空欄でも自動的にデフォルト値が保存されます

関数ベースビュー

データベースから取得した値をフォームに反映させるときは、関数ベースビュー内のフォームに引数で渡す方法が一番スムーズです

複数のフィールドに一気にデータベースから値を渡したい場合、一番短いコードで目的が達成できます

フォームフィールドの引数「initial」

モデルフィールドのデフォルトとの違いは、Pythonコードを使った自動保存などの場合はフォームクラスを経由せず保存されるため、「initial」の値は表示されません

あくまでもブラウザ上でフォームを表示した際の初期値となります

フォームクラスのinitial属性(__init__)

関数ベースビュー内のフォームに引数で渡す方法とほぼ同場面で使用できます

特に、セレクトボックスなど「choices」引数に値を入力することも兼ねている場合やsaveメソッドを使ってデータを保存する場合などはこちらの方法が便利です

日報アプリでのアップデートビューで保存方法までを公開

日報アプリのアップデートビューで初期値の表示から保存までの機能を見ていきます

方法としてはデータベースからデータを取得しますので、関数ベースビュー内での方法を使います

編集するオブジェクトを取得する

【urls.py

path("update/<int:pk>/", nippoUpdateFormView, name="nippo-update"),

「pk」を受け取るために<int:pk>/を忘れないようにしましょう!

【views.py

URLから「pk」を受け取り、オブジェクトを取得しましょう

def nippoUpdateView(request, pk):
    ...
    obj = NippoModel.objects.get(pk=pk)
    ...
    ...

引数で「pk」を受け取り、getメソッドでオブジェクトを取得します!

初期値の設定方法

フォームクラス名(request.POST or {“フォーム名1”: 初期値, “フォーム名2”: 初期値,,,})

前章で受け取ったオブジェクトを使って辞書型データを作り、NippoFormへ渡しましょう!

【views.py】

initial_values = {"title": obj.title, "content": obj.content}
form = NippoForm(request.POST or initial_values)

ブラウザからアクセス

http://localhost:8000/update/2/

無事初期値が渡されています!

データを上書き保存する

「is_valid」関数を使い、フォームが正しくPOST送信された後の処理を記述します

【views.py】

if form.is_valid():
   title = form.cleaned_data["title"]
   content = form.cleaned_data["content"]
   obj.title = title
   obj.content = content
   obj.save()

既に「obj」として編集対象のオブジェクトが作られていますので、「obj.title」と「obj.content」に新たな値を入れるだけ!

【関数ベースビュー全体】

def nippoUpdateFormView(request, pk):
    template_name = "nippo/nippo-form.html"
    obj = NippoModel.objects.get(pk=pk)
    initial_values = {"title": obj.title, "content":obj.content}
    form = NippoFormClass(request.POST or initial_values)
    ctx = {"form": form}
    if form.is_valid():
        title = form.cleaned_data["title"]
        content = form.cleaned_data["content"]
        obj.title = title
        obj.content = content
        obj.save()
    return render(request, template_name, ctx)

まとめ

Djangoのフォームで初期値を設定する方法をまとめます

【①モデルフィールドのdefaultへ値を格納する方法】

フォームからだけでなく、コード内でも保存をしたい場合などに有効です

【②関数ベースビュー内のフォームに引数として値を格納する方法】

データベースからの情報をフォームへ反映させたい場合などに有効です

【③フォームフィールドの引数「initial」へ値を格納する方法】

フォームを表示した場合に初期値として反映されます

④フォームクラス __init__関数内でフィールドのinitial属性へ値を格納する方法

フォームクラス内でsaveメソッドやchoicesへの設定など他の処理も行う場合は合わせて行うと便利です

モバイルバージョンを終了