Django フォームでフィールドに補足情報を表示!forms.BoundField.help_textの使い方をマスターしよう


forms.BoundField.help_text は、以下の情報を格納します。

  • 入力エラーに関するヒント
  • フィールドの使用方法に関するガイダンス

この情報は、フォームフィールドの下に小さなテキストとして表示されます。

forms.BoundField.help_text の設定方法

forms.BoundField.help_text は、以下の2つの方法で設定できます。

方法1:フォームフィールドの定義時に設定

from django.forms import CharField

class MyForm(forms.Form):
    name = CharField(label='名前', help_text='氏名を全角で入力してください。')

方法2:テンプレート内で設定

{% for field in form %}
    <div class="field">
        <label for="{{ field.html_name }}">{{ field.label }}</label>
        {{ field.as_widget }}
        <p class="help-text">{{ field.help_text }}</p>
    </div>
{% endfor %}

forms.BoundField.help_text は、以下の用途に活用できます。

  • フィールドに関連する追加情報を提供する
  • 入力エラーの原因を説明する
  • フィールドの使用方法に関する明確な指示を提供する

forms.BoundField.help_text を効果的に活用することで、ユーザーにとってより使いやすいフォームを作成することができます。

  • forms.BoundField.help_text は、条件に応じて動的に設定することができます。
  • forms.BoundField.help_text は、HTML 形式で記述することができます。


フォームフィールドの定義時に help_text を設定

from django.forms import CharField, ModelForm

class MyModel(models.Model):
    name = models.CharField(max_length=255)

class MyForm(ModelForm):
    class Meta:
        model = MyModel
        fields = ['name']

    name = CharField(label='名前', help_text='氏名を全角で入力してください。')
<form method="post">
    {% csrf_token %}
    <div class="field">
        <label for="id_name">名前</label>
        <input type="text" name="name" id="id_name" required>
        <p class="help-text">氏名を全角で入力してください。</p>
    </div>
    <button type="submit">送信</button>
</form>

テンプレート内で help_text を設定

{% for field in form %}
    <div class="field">
        <label for="{{ field.html_name }}">{{ field.label }}</label>
        {{ field.as_widget }}
        <p class="help-text">{{ field.help_text }}</p>
    </div>
{% endfor %}

このテンプレートは、以下のHTMLを生成します。

<form method="post">
    {% csrf_token %}
    <div class="field">
        <label for="id_name">名前</label>
        <input type="text" name="name" id="id_name" required>
        <p class="help-text">氏名を全角で入力してください。</p>
    </div>
    <div class="field">
        <label for="id_email">メールアドレス</label>
        <input type="email" name="email" id="id_email" required>
        <p class="help-text">有効なメールアドレスを入力してください。</p>
    </div>
    <button type="submit">送信</button>
</form>

条件に応じて help_text を設定

from django.forms import CharField, ModelForm

class MyModel(models.Model):
    name = models.CharField(max_length=255)

class MyForm(ModelForm):
    class Meta:
        model = MyModel
        fields = ['name']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.instance and self.instance.pk:
            self.fields['name'].help_text = '名前を変更することはできません。'

MyForm(instance=MyModel.objects.get(pk=1))

このコードは、MyModel インスタンスが存在する場合は、name フィールドの help_text を "名前を変更することはできません。" に設定します。

from django.forms import CharField, ModelForm

class MyModel(models.Model):
    name = models.CharField(max_length=255)

class MyForm(ModelForm):
    class Meta:
        model = MyModel
        fields = ['name']

    name = CharField(label='名前', help_text='<p>氏名を全角で入力してください。<br>必須項目です。</p>')

このコードは、name フィールドの help_text を HTML 形式で設定します。

from django.forms import CharField, ModelForm
from django.utils.translation import gettext_lazy

class MyModel(models.Model):
    name = models.CharField(max_length=255)

class MyForm(ModelForm):
    class Meta:
        model = MyModel
        fields = ['name']

    name = CharField(label=gettext_lazy('名前'), help_text=gettext_lazy('氏名を全角で入力してください。'))


以下に、forms.BoundField.help_text の代替方法をいくつか紹介します。

プレースホルダー属性

from django.forms import CharField

class MyForm(forms.Form):
    name = CharField(label='名前', placeholder='氏名を全角で入力してください。')

ツールチップ

JavaScript ライブラリを使用して、フィールドにマウスオーバーしたときにツールチップを表示することができます。これは、より詳細な情報を表示したい場合に有効です。

<label for="id_name">名前</label>
<input type="text" name="name" id="id_name" required data-toggle="tooltip" data-placement="top" title="氏名を全角で入力してください。">
$(document).ready(function() {
    $('[data-toggle="tooltip"]').tooltip();
});

カスタムウィジェット

from django.forms import CharField, Widget

class HelpTextWidget(Widget):
    def render(self, name, value, attrs=None):
        html = '<label for="%s">%s</label>' % (attrs['id'], attrs['label'])
        html += '<input type="text" name="%s" id="%s" value="%s">' % (name, attrs['id'], value)
        html += '<p class="help-text">%s</p>' % self.help_text
        return html

class MyForm(forms.Form):
    name = CharField(label='名前', widget=HelpTextWidget(help_text='氏名を全角で入力してください。'))

カスタムバリデーションエラーメッセージ

from django.forms import CharField, ValidationError

def validate_name(value):
    if not value.isupper():
        raise ValidationError('氏名を全角で入力してください。')

class MyForm(forms.Form):
    name = CharField(label='名前', validators=[validate_name])
from django import template

register = template.Library()

@register.simple_tag
def render_help_text(field):
    if field.help_text:
        return '<p class="help-text">%s</p>' % field.help_text
    return ''

class MyForm(forms.Form):
    name = CharField(label='名前')
{% for field in form %}
    <div class="field">
        <label for="{{ field.html_name }}">{{ field.label }}</label>
        {{ field.as_widget }}
        {{ render_help_text(field) }}
    </div>
{% endfor %}

これらの代替方法は、それぞれ異なる利点と欠点があります。状況に応じて適切な方法を選択してください。

  • forms.BoundField.help_text は、条件に応じて動的に設定することができます。
  • forms.BoundField.help_text は、HTML 形式で記述することができます。