widget属性とは
djangoアプリにおいて、Formクラス
, ModelFormクラス
のフォーム部品の種類を規定する要素。
djangoフォームではフィールドを設定した時点でフォーム部品の種類が決まる(CharField
であれば通常はinput type="text"
, choicesオプション
があればselect/option
、など)が、このwidget属性を指定することである程度はフォーム部品のコントロールが可能。
SelectDateWidget
DateField
に設定することで、年月日選択のプルダウンを生成できる。
DateTimeField
にも設定可能だが、その場合であっても年月日欄のみが表示され時刻選択はできなくなる。
class ReservationForm(ModelFrom):
class Meta:
# 中略
widgets = {
"datetime": widgets.SelectDateWidget
}
NumberInput(type="date")
HTMLのinput type="date"
と同じ形式のカレンダーを生成する。
SelectDateWidget
と同じく、DateTimeField
に対して使うと時刻が設定できなくなる。
class ReservationForm(ModelFrom):
class Meta:
# 中略
widgets = {
"datetime": NumberInput(attr={
"type": "date"
}
}
NumberInput
に対してattr
属性を指定しないとただのinput要素になる。
SpliteDateTimeWidget
日付用と時刻用の二つのinput要素を生成する。
このウィジェットを使う場合には、フォームのフィールドをSpliteDateTimeField
に設定する必要がある。
from django.forms import ModelForm, SplitDateTimeField, widgets
class ReservationForm(ModelForm):
datetime = SpliteDateTimeField(label="予約日時")
class Meta:
fields = ["datetime"]
widgets = {
"datetime": widgets.SpliteDateTimeField
}
上記の例だと日時を直接入力する必要がある。
DateField
とは異なりSelectDateWidgetP
やNumberInput(type="date")
のような便利なwidgetは用意されていないので、datepicker
やtimeDropper
などのjqueryプラグインを用いることになる。
CheckboxSelectMultiple
複数選択可能なチェックボックスを生成する。
from django.forms import ModelForm, CheckBoxSelectMultiple
class TeamForm(ModelForm):
class Meta:
fields = ["users"]
widgets = {
"users": CheckboxSelectMultiple
}