フォームの作成方法 - Django

フォームを柔軟にレンダリングするには

テンプレートに渡されたフォームは {{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 が標準で提供している機能を使えばフォームを作成するのも簡単です。