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

Django

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

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

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

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

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

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

  • Formに初期値を設定 4つの方法をまとめました
  • 4つの方法を使い分けよう!どんな場面で使うかを徹底解説!
  • 日報アプリでのアップデートビューで保存方法までを公開

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

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

【著者プロフィール】

profile_icon
【Python・Django歴】10年 x 【営業マン歴】11年
HP作成、社内システムの構築、コンサルティング

当ブログを通じて、下記アプリの作り方、コード等を公開、解説しています

☆日報アプリ「D-Repo」(デモ版)→こちら

※Djangoをベースに作成したアプリです

☆便利ツールアプリ「Tool Station」→こちら

※Django REST frameworkとReactで作成しているアプリです

初期費用ゼロ/月9,800円でWebデザインが学べる

デザインを習得するためには、客観的なフィードバックと改善が不可欠です。

以下の記事ではこんなWebデザインスクールをご紹介しています。

  • 初期費用ゼロで、月々9,800円のみ
  • オンラインで、教材が使い放題
  • コンテストや実務案件にチャレンジして報酬もGETできる

デザナルはトップデザイナーからレビューがもらえる、格安のWebデザインスクールです。

>>デザナルに興味がある方はこちらからどうぞ<<

詳細をまとめた記事もございますので、ぜひご覧ください。

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

おススメ

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

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

【例】

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

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

  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メソッドを使ってデータを保存する場合などはこちらの方法が便利です

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

django complicated

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

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

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

【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-formclass.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への設定など他の処理も行う場合は合わせて行うと便利です

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!
タイトルとURLをコピーしました