今川館

都内勤務の地味OLです

Djangoのフォームに入力した値を隠しパラメータで引き継ぐ

確認画面作るのって面倒くさいですよね?

何かのデータの登録画面を作るときに入力画面→確認画面→完了画面 という遷移にすることが多いですよね。
この、「確認画面」てやつは作るの手間がかかって嫌ですよね。
複雑なデータ登録だとセッションとかキャッシュに入力データを入れておいて確定処理が問い合わせられたら取り出して使うとかいう実装をする場合もありますが、webで値を引き継ぐときはリクエストパラメータをhiddenで持ち回るのが基本的なやり方です。

Djangoのフォームはforループで回せて、簡単に隠しパラメータの引き継ぎができます。以下で説明します。

Djangoのフォームで確認画面を作るのは実は簡単

フォームのサンプルコード

例えばこんなフォームを作って登録画面を作るとします。

# -*- coding:utf-8 -*-
from django import forms


class SampleForm(forms.Form):
    id = forms.IntegerField()
    name = forms.CharField()
    age = forms.IntegerField()
    ...
フォームフィールドはas_hiddenで隠しパラメータとしてhtmlに出力できる

まずDjangoフォームの基本として、django.forms.fieldsのフィールドにはas_hiddenというメソッドが定義されています。

なので、

{{ form.age.as_hidden }}

とテンプレートに書くと

<input id="id_age" name="age" type="hidden" value="input value">

こういうhtmlに展開されます。

でもすべてのフィールドのas_hiddenを書くのは面倒くさい

それで、hiddenで持ち回るのはいいんだけど、いちいち

<form action="{% url complete %}" method="POST">
{{ form.id.as_hidden }}
{{ form.name.as_hidden }}
{{ form.age.as_hidden }}
...
</form>

こういう風にフォームフィールドのas_hiddenを手で書くのは面倒くさいし、フィールドの名前を変えたり、フィールドを追加・削除したときに都度テンプレートを直すのは煩雑です。

フォームをforタグでループしよう

そういうときはFormをforタグでループしましょう。
さっきのテンプレートは以下のようにすっきり書くことができますから。

<form action="{% url complete %}" method="POST">
{% for field in form %}
{{ field.as_hidden }}
{% endfor %}
</form>

最近Djangoのこの仕様に気づいたのですが、意外と知られていないんじゃないかと思ってブログに書いてみました。
Django使っていてコレ知らなかった人は是非使ってみて下さい。