ウィジェット
ウィジェットは、DjangoによるHTML入力要素の表現です。 ウィジェットは、HTMLのレンダリングと、ウィジェットに対応するGET / POSTディクショナリからのデータの抽出を処理します。
組み込みウィジェットによって生成されたHTMLは、<!DOCTYPE html>
を対象とするHTML5構文を使用します。 たとえば、checked='checked'
のXHTMLスタイルではなく、checked
などのブール属性を使用します。
ヒント
ウィジェットをフォームフィールドと混同しないでください。 フォームフィールドは入力検証のロジックを処理し、テンプレートで直接使用されます。 ウィジェットは、WebページでのHTMLフォーム入力要素のレンダリングと、送信された生データの抽出を処理します。 ただし、ウィジェットはフィールドを形成するために割り当てする必要があります。
ウィジェットの指定
フォームでフィールドを指定するたびに、Djangoは表示されるデータのタイプに適したデフォルトのウィジェットを使用します。 どのウィジェットがどのフィールドで使用されているかを確認するには、組み込みフィールドクラスに関するドキュメントを参照してください。
ただし、フィールドに別のウィジェットを使用する場合は、フィールド定義で widget 引数を使用できます。 例えば:
from django import forms
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField(widget=forms.Textarea)
これにより、デフォルトの TextInput ウィジェットではなく、より大きな Textarea ウィジェットを使用するコメント付きのフォームが指定されます。
ウィジェットの引数の設定
多くのウィジェットには、オプションの追加の引数があります。 フィールドでウィジェットを定義するときに設定できます。 次の例では、 years 属性が SelectDateWidget に設定されています。
from django import forms
BIRTH_YEAR_CHOICES = ['1980', '1981', '1982']
FAVORITE_COLORS_CHOICES = [
('blue', 'Blue'),
('green', 'Green'),
('black', 'Black'),
]
class SimpleForm(forms.Form):
birth_year = forms.DateField(widget=forms.SelectDateWidget(years=BIRTH_YEAR_CHOICES))
favorite_colors = forms.MultipleChoiceField(
required=False,
widget=forms.CheckboxSelectMultiple,
choices=FAVORITE_COLORS_CHOICES,
)
使用可能なウィジェットとそれらが受け入れる引数の詳細については、組み込みウィジェットを参照してください。
Selectウィジェットから継承するウィジェット
Select ウィジェットから継承するウィジェットは選択肢を処理します。 それらは、選択できるオプションのリストをユーザーに提示します。 ウィジェットが異なれば、この選択肢の提示も異なります。 Select ウィジェット自体は<select>
HTMLリスト表現を使用し、 RadioSelect はラジオボタンを使用します。
Select ウィジェットは、 ChoiceField フィールドでデフォルトで使用されます。 ウィジェットに表示される選択肢は ChoiceField から継承され、 ChoiceField.choices を変更すると、 Select.choices が更新されます。 例えば:
>>> from django import forms
>>> CHOICES = [('1', 'First'), ('2', 'Second')]
>>> choice_field = forms.ChoiceField(widget=forms.RadioSelect, choices=CHOICES)
>>> choice_field.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices = []
>>> choice_field.choices = [('1', 'First and only')]
>>> choice_field.widget.choices
[('1', 'First and only')]
ただし、 choices 属性を提供するウィジェットは、 CharField など、選択に基づかないフィールドで使用できますが、 ChoiceField を使用することをお勧めします。選択が表現ウィジェットだけでなくモデルに固有である場合のベースのフィールド。
ウィジェットインスタンスのカスタマイズ
DjangoがウィジェットをHTMLとしてレンダリングする場合、レンダリングされるマークアップはごくわずかです。Djangoは、クラス名やその他のウィジェット固有の属性を追加しません。 これは、たとえば、すべての TextInput ウィジェットがWebページで同じように表示されることを意味します。
ウィジェットをカスタマイズするには、ウィジェットインスタンスごととウィジェットクラスごとの2つの方法があります。
ウィジェットインスタンスのスタイリング
あるウィジェットインスタンスを別のウィジェットインスタンスとは異なって見せたい場合は、ウィジェットオブジェクトがインスタンス化されてフォームフィールドに割り当てられるときに追加の属性を指定する必要があります(おそらくCSSファイルにいくつかのルールを追加します)。
たとえば、次の形式を取ります。
from django import forms
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField()
このフォームには、3つのデフォルトの TextInput ウィジェットが含まれ、デフォルトのレンダリングが使用されます。CSSクラスや追加の属性はありません。 これは、各ウィジェットに提供される入力ボックスがまったく同じようにレンダリングされることを意味します。
>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" required></td></tr>
実際のWebページでは、すべてのウィジェットが同じように見えることはおそらく望ましくありません。 コメントにはより大きな入力要素が必要な場合があり、「name」ウィジェットに特別なCSSクラスが必要な場合があります。 'type'属性を指定して、新しいHTML5入力タイプを利用することもできます。 これを行うには、ウィジェットを作成するときに Widget.attrs 引数を使用します。
class CommentForm(forms.Form):
name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))
url = forms.URLField()
comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))
フォーム定義でウィジェットを変更することもできます。
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField()
name.widget.attrs.update({'class': 'special'})
comment.widget.attrs.update(size='40')
または、フィールドがフォーム上で直接宣言されていない場合(モデルフォームフィールドなど)、 Form.fields 属性を使用できます。
class CommentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['name'].widget.attrs.update({'class': 'special'})
self.fields['comment'].widget.attrs.update(size='40')
Djangoは、レンダリングされた出力に追加の属性を含めます。
>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" class="special" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" size="40" required></td></tr>
attrs を使用してHTML id
を設定することもできます。 例については、 BoundField.id_for_label を参照してください。
ウィジェットクラスのスタイリング
ウィジェットを使用すると、アセット(css
およびjavascript
)を追加し、それらの外観と動作をより深くカスタマイズすることができます。
簡単に言うと、ウィジェットをサブクラス化し、「メディア」内部クラスを定義するまたは「メディア」プロパティを作成する必要があります。
これらのメソッドには、いくらか高度なPythonプログラミングが含まれ、 Form Assets トピックガイドで詳細に説明されています。
基本ウィジェットクラス
基本ウィジェットクラス Widget および MultiWidget は、すべての組み込みウィジェットによってサブクラス化され、カスタムウィジェットの基盤として機能する場合があります。
Widget
- class Widget(attrs=None)
この抽象クラスはレンダリングできませんが、基本属性 attrs を提供します。 カスタムウィジェットに render()メソッドを実装またはオーバーライドすることもできます。
- attrs
レンダリングされたウィジェットに設定されるHTML属性を含む辞書。
>>> from django import forms >>> name = forms.TextInput(attrs={'size': 10, 'title': 'Your name'}) >>> name.render('name', 'A name') '<input title="Your name" type="text" name="name" value="A name" size="10">'
True
またはFalse
の値を属性に割り当てると、HTML5ブール属性としてレンダリングされます。>>> name = forms.TextInput(attrs={'required': True}) >>> name.render('name', 'A name') '<input name="name" type="text" value="A name" required>' >>> >>> name = forms.TextInput(attrs={'required': False}) >>> name.render('name', 'A name') '<input name="name" type="text" value="A name">'
- supports_microseconds
デフォルトが
True
の属性。False
に設定すると、datetime
およびtime
のマイクロ秒部分が0
に設定されます。
- format_value(value)
ウィジェットテンプレートで使用する値をクリーンアップして返します。
value
は有効な入力であることが保証されていないため、サブクラスの実装は防御的にプログラムする必要があります。
- get_context(name, value, attrs)
ウィジェットテンプレートをレンダリングするときに使用する値のディクショナリを返します。 デフォルトでは、ディクショナリには単一のキー
'widget'
が含まれています。これは、次のキーを含むウィジェットのディクショナリ表現です。'name'
:name
引数からのフィールドの名前。'is_hidden'
:このウィジェットが非表示になっているかどうかを示すブール値。'required'
:このウィジェットのフィールドが必須かどうかを示すブール値。'value'
: format_value()によって返される値。'attrs'
:レンダリングされたウィジェットに設定されるHTML属性。 attrs 属性とattrs
引数の組み合わせ。'template_name'
:self.template_name
の値。
Widget
サブクラスは、このメソッドをオーバーライドすることでカスタムコンテキスト値を提供できます。
- id_for_label(id_)
フィールドのIDを指定して、
<label>
で使用するためにこのウィジェットのHTMLID属性を返します。 IDが利用できない場合は、None
を返します。一部のウィジェットには複数のHTML要素があり、したがって複数のIDがあるため、このフックが必要です。 その場合、このメソッドはウィジェットのタグの最初のIDに対応するID値を返す必要があります。
- render(name, value, attrs=None, renderer=None)
指定されたレンダラーを使用してウィジェットをHTMLにレンダリングします。
renderer
がNone
の場合、:setting: `FORM_RENDERER` 設定のレンダラーが使用されます。
- value_from_datadict(data, files, name)
データのディクショナリとこのウィジェットの名前を指定すると、このウィジェットの値を返します。
files
には、 request.FILES からのデータが含まれている可能性があります。 値が指定されていない場合は、None
を返します。 また、フォームデータの処理中にvalue_from_datadict
が複数回呼び出される可能性があるため、カスタマイズして高額な処理を追加する場合は、キャッシュメカニズムを自分で実装する必要があります。
- value_omitted_from_data(data, files, name)
data
およびfiles
辞書とこのウィジェットの名前を指定すると、ウィジェットのデータまたはファイルがあるかどうかが返されます。メソッドの結果は、モデルフォームのフィールドがデフォルトにフォールバックするかどうかに影響します。
特殊なケースは、 CheckboxInput 、 CheckboxSelectMultiple 、および SelectMultiple です。これらは、チェックボックスがオフで
<select multiple>
が選択されていないため、常にFalse
を返します。 HTMLフォーム送信のデータには表示されないため、ユーザーが値を送信したかどうかは不明です。
- use_required_attribute(initial)
フォームフィールドの
initial
値を指定すると、ウィジェットをrequired
HTML属性でレンダリングできるかどうかを返します。 フォームは、 Field.required および Form.use_required_attribute とともにこのメソッドを使用して、各フィールドのrequired
属性を表示するかどうかを決定します。デフォルトでは、非表示のウィジェットには
False
を返し、それ以外の場合はTrue
を返します。 特殊なケースは、 FileInput と ClearableFileInput でinitial
が設定されている場合はFalse
を返し、 CheckboxSelectMultiple は常に[ X174X] ブラウザーの検証では、少なくとも1つではなく、すべてのチェックボックスをオンにする必要があるためです。ブラウザの検証と互換性のないカスタムウィジェットでこのメソッドをオーバーライドします。 たとえば、非表示の
textarea
要素でバックアップされたWSYSIWGテキストエディタウィジェットは、非表示フィールドでのブラウザの検証を回避するために、常にFalse
を返したい場合があります。バージョン3.1で変更:古いバージョンでは、
initial
が設定されていると、 FileInput に対してTrue
が返されていました。
MultiWidget
- class MultiWidget(widgets, attrs=None)
複数のウィジェットで構成されるウィジェット。 MultiWidget は、 MultiValueField と連携して機能します。
MultiWidget には、必須の引数が1つあります。
- widgets
必要なウィジェットを含むイテラブル。 例えば:
>>> from django.forms import MultiWidget, TextInput >>> widget = MultiWidget(widgets=[TextInput, TextInput]) >>> widget.render('name', ['john', 'paul']) '<input type="text" name="name_0" value="john"><input type="text" name="name_1" value="paul">'
各サブウィジェットの
name
属性にカスタムサフィックスを指定するために、辞書を提供できます。 この場合、(key, widget)
ペアごとに、属性値を生成するために、キーがウィジェットのname
に追加されます。 1つのウィジェットのサフィックスを抑制するために、1つのキーに空の文字列()を指定できます。 例えば:
>>> widget = MultiWidget(widgets={'': TextInput, 'last': TextInput}) >>> widget.render('name', ['john', 'paul']) '<input type="text" name="name" value="john"><input type="text" name="name_last" value="paul">'
そして1つの必要な方法:
- decompress(value)
このメソッドは、フィールドから単一の「圧縮された」値を取得し、「解凍された」値のリストを返します。 入力値は有効であると見なすことができますが、必ずしも空でない必要はありません。
このメソッドはサブクラスによって実装する必要があり、値が空である可能性があるため、実装は防御的である必要があります。
「解凍」の背後にある理論的根拠は、フォームフィールドの結合された値を各ウィジェットの値に「分割」する必要があるということです。
この例は、 SplitDateTimeWidget が
datetime
値を、日付と時刻を2つの別々の値に分割したリストに変換する方法です。from django.forms import MultiWidget class SplitDateTimeWidget(MultiWidget): # ... def decompress(self, value): if value: return [value.date(), value.time()] return [None, None]
ヒント
MultiValueField には、すべてのメンバーフィールドのクリーンな値を1つに結合するという、逆の責任を持つ補完的なメソッド compress()があることに注意してください。
それはいくつかのカスタムコンテキストを提供します:
- get_context(name, value, attrs)
Widget.get_context()で説明されている
'widget'
キーに加えて、MultiWidget
はwidget['subwidgets']
キーを追加します。これらは、ウィジェットテンプレートでループすることができます。
{% for subwidget in widget.subwidgets %} {% include subwidget.template_name with widget=subwidget %} {% endfor %}
MultiWidget をサブクラス化して、日付を日、月、年とともにさまざまな選択ボックスに表示するウィジェットの例を次に示します。 このウィジェットは、 MultiValueField ではなく DateField で使用することを目的としているため、 value_from_datadict()を実装しました。
from datetime import date from django import forms class DateSelectorWidget(forms.MultiWidget): def __init__(self, attrs=None): days = [(day, day) for day in range(1, 32)] months = [(month, month) for month in range(1, 13)] years = [(year, year) for year in [2018, 2019, 2020]] widgets = [ forms.Select(attrs=attrs, choices=days), forms.Select(attrs=attrs, choices=months), forms.Select(attrs=attrs, choices=years), ] super().__init__(widgets, attrs) def decompress(self, value): if isinstance(value, date): return [value.day, value.month, value.year] elif isinstance(value, str): year, month, day = value.split('-') return [day, month, year] return [None, None, None] def value_from_datadict(self, data, files, name): day, month, year = super().value_from_datadict(data, files, name) # DateField expects a single string that it can parse into a date. return '{}-{}-{}'.format(year, month, day)
コンストラクターは、リスト内にいくつかの Select ウィジェットを作成します。
super()
メソッドは、このリストを使用してウィジェットをセットアップします。必要なメソッド decompress()は、
datetime.date
の値を、各ウィジェットに対応する日、月、および年の値に分割します。 存在しない2月30日など、無効な日付が選択された場合、 DateField は代わりにこのメソッドに文字列を渡すため、解析が必要になります。 最後のreturn
は、value
がNone
の場合に処理されます。つまり、サブウィジェットのデフォルトはありません。value_from_datadict()のデフォルトの実装は、各
Widget
に対応する値のリストを返します。 これは、MultiWidget
を MultiValueField とともに使用する場合に適しています。 ただし、このウィジェットを DateField で使用する必要があるため、このメソッドをオーバーライドしました。 ここでの実装は、サブウィジェットからのデータを DateField が期待する形式の文字列に結合します。
組み込みウィジェット
Djangoは、すべての基本的なHTMLウィジェットの表現に加えて、テキストの入力、さまざまなチェックボックスとセレクターなど、django.forms.widgets
モジュールで一般的に使用されるウィジェットのグループを提供します。 、ファイルのアップロード、および複数値入力の処理。
テキストの入力を処理するウィジェット
これらのウィジェットは、HTML要素input
およびtextarea
を利用します。
TextInput
- class TextInput
- ;*
input_type
:'text'
template_name
:'django/forms/widgets/text.html'
- 次のようにレンダリングします:
<input type="text" ...>
NumberInput
- class NumberInput
input_type
:'number'
template_name
:'django/forms/widgets/number.html'
次のようにレンダリングします:
<input type="number" ...>
すべてのブラウザが
number
入力タイプへのローカライズされた数値の入力をサポートしているわけではないことに注意してください。 Django自体は、 localize プロパティがTrue
に設定されているフィールドにそれらを使用することを避けています。
EmailInput
- class EmailInput
- ;*
input_type
:'email'
template_name
:'django/forms/widgets/email.html'
- 次のようにレンダリングします:
<input type="email" ...>
URLInput
- class URLInput
- ;*
input_type
:'url'
template_name
:'django/forms/widgets/url.html'
- 次のようにレンダリングします:
<input type="url" ...>
PasswordInput
- class PasswordInput
input_type
:'password'
template_name
:'django/forms/widgets/password.html'
次のようにレンダリングします:
<input type="password" ...>
オプションの引数を1つ取ります。
- render_value
検証エラー後にフォームが再表示されたときにウィジェットに値が入力されるかどうかを決定します(デフォルトは
False
)。
DateInput
- class DateInput
input_type
:'text'
template_name
:'django/forms/widgets/date.html'
次のようにレンダリングします:
<input type="text" ...>
TextInput と同じ引数を取りますが、オプションの引数がもう1つあります。
- format
このフィールドの初期値が表示される形式。
format
引数が指定されていない場合、デフォルトの形式は:setting: `DATE_INPUT_FORMATS` で最初に見つかった形式であり、形式のローカリゼーションを尊重します。
DateTimeInput
- class DateTimeInput
input_type
:'text'
template_name
:'django/forms/widgets/datetime.html'
次のようにレンダリングします:
<input type="text" ...>
TextInput と同じ引数を取りますが、オプションの引数がもう1つあります。
- format
このフィールドの初期値が表示される形式。
format
引数が指定されていない場合、デフォルトの形式は:setting: `DATETIME_INPUT_FORMATS` で最初に見つかった形式であり、形式のローカリゼーションを尊重します。デフォルトでは、時間値のマイクロ秒部分は常に
0
に設定されています。 マイクロ秒が必要な場合は、 supports_microseconds 属性がTrue
に設定されたサブクラスを使用します。
TimeInput
- class TimeInput
input_type
:'text'
template_name
:'django/forms/widgets/time.html'
次のようにレンダリングします:
<input type="text" ...>
TextInput と同じ引数を取りますが、オプションの引数がもう1つあります。
- format
このフィールドの初期値が表示される形式。
format
引数が指定されていない場合、デフォルトの形式は:setting: `TIME_INPUT_FORMATS` で最初に見つかった形式であり、形式のローカリゼーションを尊重します。マイクロ秒の処理については、 DateTimeInput を参照してください。
Textarea
- class Textarea
- ;*
template_name
:'django/forms/widgets/textarea.html'
- 次のようにレンダリングします:
<textarea>...</textarea>
- 次のようにレンダリングします:
セレクターウィジェットとチェックボックスウィジェット
これらのウィジェットは、HTML要素<select>
、<input type="checkbox">
、および<input type="radio">
を利用します。
複数の選択肢をレンダリングするウィジェットには、各選択肢のレンダリングに使用されるテンプレートを指定するoption_template_name
属性があります。 たとえば、 Select ウィジェットの場合、select_option.html
は<select>
の<option>
をレンダリングします。
CheckboxInput
- class CheckboxInput
input_type
:'checkbox'
template_name
:'django/forms/widgets/checkbox.html'
次のようにレンダリングします:
<input type="checkbox" ...>
オプションの引数を1つ取ります。
- check_test
CheckboxInput
の値を受け取り、その値のチェックボックスをオンにする必要がある場合はTrue
を返す呼び出し可能オブジェクト。
Select
- class Select
template_name
:'django/forms/widgets/select.html'
option_template_name
:'django/forms/widgets/select_option.html'
次のようにレンダリングします:
<select><option ...>...</select>
- choices
フォームフィールドに
choices
属性がない場合、この属性はオプションです。 含まれている場合、フィールドで属性が更新されたときに、ここで設定したものはすべて上書きされます。
NullBooleanSelect
- class NullBooleanSelect
template_name
:'django/forms/widgets/select.html'
option_template_name
:'django/forms/widgets/select_option.html'
「不明」、「はい」、「いいえ」のオプションでウィジェットを選択します
SelectMultiple
- class SelectMultiple
template_name
:'django/forms/widgets/select.html'
option_template_name
:'django/forms/widgets/select_option.html'
Select に似ていますが、複数選択できます:
<select multiple>...</select>
RadioSelect
- class RadioSelect
template_name
:'django/forms/widgets/radio.html'
option_template_name
:'django/forms/widgets/radio_option.html'
Select に似ていますが、
<li>
タグ内のラジオボタンのリストとして表示されます。<ul> <li><input type="radio" name="..."></li> ... </ul>
生成されたマークアップをよりきめ細かく制御するために、テンプレートのラジオボタンをループすることができます。
RadioSelect
をウィジェットとして使用するフィールドbeatles
を持つフォームmyform
を想定します。<fieldset> <legend>{{ myform.beatles.label }}</legend> {% for radio in myform.beatles %} <div class="myradio"> {{ radio }} </div> {% endfor %} </fieldset>
これにより、次のHTMLが生成されます。
<fieldset> <legend>Radio buttons</legend> <div class="myradio"> <label for="id_beatles_0"><input id="id_beatles_0" name="beatles" type="radio" value="john" required> John</label> </div> <div class="myradio"> <label for="id_beatles_1"><input id="id_beatles_1" name="beatles" type="radio" value="paul" required> Paul</label> </div> <div class="myradio"> <label for="id_beatles_2"><input id="id_beatles_2" name="beatles" type="radio" value="george" required> George</label> </div> <div class="myradio"> <label for="id_beatles_3"><input id="id_beatles_3" name="beatles" type="radio" value="ringo" required> Ringo</label> </div> </fieldset>
これには
<label>
タグが含まれていました。 より細かくするには、各ラジオボタンのtag
、choice_label
、およびid_for_label
属性を使用できます。 たとえば、このテンプレート…<fieldset> <legend>{{ myform.beatles.label }}</legend> {% for radio in myform.beatles %} <label for="{{ radio.id_for_label }}"> {{ radio.choice_label }} <span class="radio">{{ radio.tag }}</span> </label> {% endfor %} </fieldset>
…次のHTMLになります。
<fieldset> <legend>Radio buttons</legend> <label for="id_beatles_0"> John <span class="radio"><input id="id_beatles_0" name="beatles" type="radio" value="john" required></span> </label> <label for="id_beatles_1"> Paul <span class="radio"><input id="id_beatles_1" name="beatles" type="radio" value="paul" required></span> </label> <label for="id_beatles_2"> George <span class="radio"><input id="id_beatles_2" name="beatles" type="radio" value="george" required></span> </label> <label for="id_beatles_3"> Ringo <span class="radio"><input id="id_beatles_3" name="beatles" type="radio" value="ringo" required></span> </label> </fieldset>
テンプレートに
テンプレート:Myform.beatles
が含まれている場合など、ラジオボタンをループしないことにした場合、上記のように、<ul>
に<li>
タグが付いて出力されます。外側の
<ul>
コンテナーは、定義されている場合はウィジェットのid
属性を受け取り、それ以外の場合は BoundField.auto_id を受け取ります。ラジオボタンをループする場合、
label
タグとinput
タグには、それぞれfor
属性とid
属性が含まれます。 各ラジオボタンには、要素のIDを出力するためのid_for_label
属性があります。
CheckboxSelectMultiple
- class CheckboxSelectMultiple
template_name
:'django/forms/widgets/checkbox_select.html'
option_template_name
:'django/forms/widgets/checkbox_option.html'
SelectMultiple に似ていますが、チェックボックスのリストとして表示されます。
<ul> <li><input type="checkbox" name="..." ></li> ... </ul>
外側の
<ul>
コンテナーは、定義されている場合はウィジェットのid
属性を受け取り、それ以外の場合は BoundField.auto_id を受け取ります。
RadioSelect と同様に、ウィジェットの選択肢の個々のチェックボックスをループできます。 RadioSelect とは異なり、ブラウザの検証では少なくとも1つではなくすべてのチェックボックスをオンにする必要があるため、フィールドが必要な場合、チェックボックスにはrequired
HTML属性が含まれません。
チェックボックスをループすると、label
タグとinput
タグには、それぞれfor
属性とid
属性が含まれます。 各チェックボックスには、要素のIDを出力するためのid_for_label
属性があります。
ファイルアップロードウィジェット
FileInput
- class FileInput
- ;*
template_name
:'django/forms/widgets/file.html'
- 次のようにレンダリングします:
<input type="file" ...>
- 次のようにレンダリングします:
ClearableFileInput
- class ClearableFileInput
- ;*
template_name
:'django/forms/widgets/clearable_file_input.html'
<input type="file" ...>
のようにレンダリングされ、フィールドが不要で初期データがある場合は、フィールドの値をクリアするための追加のチェックボックス入力があります。
複合ウィジェット
SplitDateTimeWidget
- class SplitDateTimeWidget
template_name
:'django/forms/widgets/splitdatetime.html'
日付用の DateInput と時刻用の TimeInput の2つのウィジェットの周りのラッパー( MultiWidget を使用)。 DateTimeField ではなく SplitDateTimeField とともに使用する必要があります。
SplitDateTimeWidget
には、いくつかのオプションの引数があります。- date_format
DateInput.format に似ています
- time_format
TimeInput.format に似ています
- date_attrs
- time_attrs
Widget.attrs に似ています。 レンダリングされた DateInput ウィジェットと TimeInput ウィジェットにそれぞれ設定されるHTML属性を含む辞書。 これらの属性が設定されていない場合は、代わりに Widget.attrs が使用されます。
SelectDateWidget
- class SelectDateWidget
template_name
:'django/forms/widgets/select_date.html'
3つの Select ウィジェットの周りのラッパー:月、日、年に1つずつ。
いくつかのオプションの引数を取ります:
- years
「年」選択ボックスで使用するオプションのリスト/年のタプル。 デフォルトは、現在の年と次の9年を含むリストです。
- months
「月」選択ボックスで使用する月のオプションの辞書。
dictのキーは月番号(1-インデックス付き)に対応し、値は表示された月です。
MONTHS = { 1:_('jan'), 2:_('feb'), 3:_('mar'), 4:_('apr'), 5:_('may'), 6:_('jun'), 7:_('jul'), 8:_('aug'), 9:_('sep'), 10:_('oct'), 11:_('nov'), 12:_('dec') }
- empty_label
DateField が不要な場合、 SelectDateWidget のリストの上部に空の選択肢が表示されます(デフォルトでは
---
)。 このラベルのテキストは、empty_label
属性を使用して変更できます。empty_label
は、string
、list
、またはtuple
にすることができます。 文字列を使用する場合、すべての選択ボックスには、このラベルが付いた空の選択肢があります。empty_label
が3つの文字列要素のlist
またはtuple
の場合、選択ボックスには独自のカスタムラベルが付けられます。 ラベルは('year_label', 'month_label', 'day_label')
の順序である必要があります。# A custom empty label with string field1 = forms.DateField(widget=SelectDateWidget(empty_label="Nothing")) # A custom empty label with tuple field1 = forms.DateField( widget=SelectDateWidget( empty_label=("Choose Year", "Choose Month", "Choose Day"), ), )