2010年10月25日月曜日

Django フォームを使用するテンプレート定義のメモ

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 と条件設定しているのは、非表示フィールドのラベルを表示しないようにするためである。この使用例の処理フローは次の通り。

template_flowchart.JPG

項目フィールド名は、{{ form.フィールドID.name }} で表示できる。 フィールドのタイプやウィジットを表示するには、カスタムフィルターを設定する方法などがあるが、ちょっと面倒だ。 (参照) 

 

この他、詳細は次のサイトを参照のこと