(最終更新月:2021年12月)
✔こんな方へ向けての記事となります
「Djangoのフォームで初期値を設定する方法がわからない!」
「方法がいくつかあるけど、どうやって使い分けるの?」
「表示するだけでなく、保存する方法も合わせて知りたい!」
✔当記事を通じて、解説していくことは下記の通りです
- Formに初期値を設定 4つの方法をまとめました
- 4つの方法を使い分けよう!どんな場面で使うかを徹底解説!
- 日報アプリでのアップデートビューで保存方法までを公開
フォームへ値を渡すだけでなく、保存する方法まで実例を持ってご紹介します
フォームに値を渡し、受け取る、保存までの基本がマスターできます
Formに初期値を設定 4つの方法をまとめました
こちらでは、初期値を設定する方法を4つご説明します。
それぞれ特徴や使う場面が異なるので、すべて知っておくと良いでしょう。
- モデルフィールドのdefault
- ビュー関数内のフォームに引数で渡す
- フォームフィールドの引数「initial」
- フォームクラス init関数内でフィールドのinitial属性
モデルフィールドのdefaultへ値を格納
モデルクラス内の各フィールドで、初期値(default)を設定します
【例】
title = models.CharField(default=値,,,,)
※フォームで表示したい場合は、ModelFormを使っていないと表示されません。
ビュー関数内のフォームに引数として値を格納
- フォーム名をキー、初期値を値とした辞書型のオブジェクトを作成
- フォームクラスの引数に作成したオブジェクトを渡す
- コンテキストでフォームクラスを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属性へ値を格納
- __init__メソッド内の「self.base_field」でフィールドにアクセス
- 各フィールドの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)
ブラウザからアクセス
無事初期値が渡されています!
データを上書き保存する
「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への設定など他の処理も行う場合は合わせて行うと便利です