フォームを柔軟にレンダリングするには
テンプレートに渡されたフォームは {{form}} や {{form.as_table}} などで表示できますが、HTML の表示を自由に変更するには不向きです。
Django には、入力項目ごとにフォームをレンダリングすることができます。
各フィールドには以下の属性があります。
label | ラベル用のテキスト |
label_tag | ラベルのHTMLタグ |
id_for_label | ラベルタグ用のid |
value | インプットタグ用のvalue要素の値 |
help_text | 説明文言 |
html_name | インプットタグのname要素の値 |
errors | エラーメッセージの集まり |
field | フォームクラスのプロパティ |
Books モデルのタイトルの入力フォームだけを表示するには次のようにします。
<p>
{{form.title.label_tag}}
{{form.title}}
{% for error in form.title.errors %}
{{error}}
{% endfor %}
</p>
Books モデルのフォームをまとめてレンダリングするには次のようにします。
pythonApp\class_crud\class_crud\books\templates\books\create.html
{% extends "books/base.html" %}
{% block title %}books/create view{% endblock %}
{% block content %}
<h1>books/create</h1>
<table>
<form method="post" novalidate>
{% csrf_token %}
{% for field in form %}
<div class="field">{{field.label_tag}}{{field}}</div>
{% for error in field.errors%}
<p>{{error}}</p>
{% endfor%}
{% endfor %}
<p><input type="submit" value="Save"></p>
</form>
</table>
{% endblock %}
{{form.as_table}} などでレンダリングした場合、バリデーションのエラーは、フォームの上側に表示されます。
上記のように記述することでバリデーションのエラー表示を下側に変更することができます。
自分で HTML ファイルに「 input タグ 」を使いフォームを作成すると、バリデーションエラーが発生した場合、正常なフォームの値は保持されません。
そのため、正常なフォームの値を保持したい場合、自分で値を保持する仕組みを作成する必要があります。
しかし、Django が提供している {{form}} や {{form.as_table}} で作成すれば、バリデーションエラーが発生しても、正常なフォームの値は保持されます。
このページで紹介した方法でも、バリデーションエラーが発生した場合の正常なフォームの値は保持はされます。
Django が標準で提供している機能を使えばフォームを作成するのも簡単です。