本文へスキップ
BecomeCoder

Djangoコース · 第4章 フォームと入力 · レッスン18

フォームをHTMLにする ― as_p とウィジェット

ブラウザで完結

導入

フォームクラスは、入力欄の HTML も自動で生成できます。ラベル・入力欄・エラー表示を、手書きせずにまとめて出せるのが便利なところです。

説明

フォームインスタンスを as_p() などで文字列化すると、<label><input> の HTML が出てきます。

import django
from django.conf import settings
if not settings.configured:
    settings.configure(DEBUG=True, SECRET_KEY="dev", INSTALLED_APPS=[])
    django.setup()

from django import forms

class SignupForm(forms.Form):
    username = forms.CharField(label="ユーザー名", max_length=20)
    password = forms.CharField(label="パスワード", widget=forms.PasswordInput)
    agree = forms.BooleanField(label="規約に同意する")

form = SignupForm()
print(form.as_p())   # <p><label>…</label><input…></p> が項目分だけ出る
  • label="..." … 入力欄の見出し。
  • widget=forms.PasswordInput … 入力欄の種類を指定。PasswordInput なら <input type="password">(伏字)になります。他に Textarea(複数行)、CheckboxInputSelect(選択肢)など。
  • as_p()(段落)、as_ul()(箇条書き)、as_table()(表)で並べ方を選べます。

テンプレートでは、ビューから渡した form{{ form.as_p }} と書くだけで表示できます。

<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button>送信</button>
</form>

ModelForm を使うと、モデル(次章)から自動でフォームを作れます。入力欄の定義を二度書かずに済むので、実務ではこちらが主役です。

# 次章のモデルと組み合わせると…
from django.forms import ModelForm
class PostForm(ModelForm):
    class Meta:
        model = Post          # モデルを指定するだけ
        fields = ["title", "body"]   # 使うフィールドを選ぶ

やってみよう

widget=forms.PasswordInputforms.Textarea に変えると、password 欄が複数行入力になります。as_p()as_ul() に変えて、並び方の違いも見てみましょう。

演習

SignupForm に、複数行入力の自己紹介欄 bio を追加してください(forms.CharField(label="自己紹介", widget=forms.Textarea))。form.as_p() の出力に <textarea が含まれれば成功です。

ヒント1を見る

bio = forms.CharField(label="自己紹介", widget=forms.Textarea) をクラスに追加します。

ヒント2を見る

Textarea<textarea> タグを生成します。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。