Djangoのフォームを使ったテンプレート定義について簡単にメモ書きする。
- Django 標準のフォーム用テンプレート言語を使用する
-
as_p / as_ul / as_table はフォームに含まれるフィールドをセットで出力する。
またフィールドと一緒に変数名をラベルとして出力する(変数名のアンダーバーは空白に変換)。- as_p ・・・段落として表示する。 各フィールド及びラベルはセットで<p>タグによって包まれる。
- as_ul ・・・リスト形式で表示する。 各フィールド及びラベルはセットで<li>ダグで包まれるが、<ul>もしくは<ol>タグは付加されないのでデザインの応じて付加する。
- as_table ・・・テーブル形式で表示する。 各フィールド及びラベルは<td>、<th>及び<tr>ダグで包まれるが、<table>タグは付加されないので付加する必要がある。
<form action="/contact/" method="POST"> {{ form.as_p }} <input type="submit" value="Submit"> </form>
フィールドの並び順はフォームクラスで定義された順番になる。
- テンプレート定義をカスタマイズする(フィールドIDを使う)
テンプレート定義をカスタマイズする時に使用するフォーム定義は以下の通り。
- フィールド ・・・ {{ form.フィールドID }}
- フィールド・ラベル ・・・ {{ form.フィールドID.label_tag }}
label_tagはlabelでもよいが、label_tagの方が必要なHTMLコードを付加してくれる。 例 field.label → <th>商品名</th> field.label_tag → <th><label for="id_xxxxxx">商品名</label></th> - フィールド・エラー ・・・ {{ form.フィールドID.errors }}
使用例
<form action="/contact/" method="POST"> {{ form.item_name }} <input type="submit" value="Submit"> </form>
次はフォームセットをテーブルタグ内に書き込む処理を行っているテンプレート定義使用例。for文を使って効率的に書き込んでいる。
<body> <form action="/input/" method="POST"> {{ formset.management_form }} <table> {% for form in formset.forms %} <!--フォームセット先頭行を使ってフィールドラベルタグを表示--> {% if forloop.first %} <tr> {% for field in form %} {% if not field.is_hidden %} <th>{{ field.label_tag }}</th> {% endif %} {% endfor %} </tr> {% endif %} <tr> <!--フォームセットデーター表示--> {% for field in form %} <td>{{ field }}{{ field.errors }}</td> {% endfor %} </tr> {% endfor %} </table> <input type="submit" value="Submit"> </form> </body>
ラベルタグ描画で if not field.is_hidden と条件設定しているのは、非表示フィールドのラベルを表示しないようにするためである。この使用例の処理フローは次の通り。
項目フィールド名は、{{ form.フィールドID.name }} で表示できる。 フィールドのタイプやウィジットを表示するには、カスタムフィルターを設定する方法などがあるが、ちょっと面倒だ。 (参照)
- Djangoドキュメント フォームの操作
- Djangoドキュメント フォーム API
- Djangoドキュメント PythonプログラマのためのDjango テンプレート言語ガイド
- Djangoドキュメント Djangoテンプレート言語
- Djangoドキュメント 組み込みタグ/フィルタリファレンス
この他、詳細は次のサイトを参照のこと