フォームクラスを作る際、フィールド定義に使うオプションなど。
class UserForm(forms.Form): f = forms.EmailField(xxx=xxx)
Form fields | Django ドキュメント | Django
Field.clean(value)
f = forms.EmailField()
f.clean('xxx')
渡された値でフォームのバリデーションを行う。
問題があればValidationErrorを出し、問題なければチェック済みのその値を返す。
cleanをオーバーライドして独自のcleanを実装するのも有効。
clean_xxxxでフィールドごとのcleanも定義可能。
required
デフォルトでは必須入力となっているので、Noneや空文字を渡すとバリデーションエラーとなる。
スペースや0やFalseやTrueは問題ない。
必須にしない場合
f = forms.CharField(required=False)
Field.label
デフォルトのラベルは、単語の先頭を大文字に、アンダースコアを空白になるが、変えたいとき。
name = forms.CharField(label='Your name')
Field.label_suffix
ラベルの末尾につける文字。Formクラスで指定すれば、すべてのフィールドに反映される。
forms.IntegerField(label='2 + 2', label_suffix=' =')
f = ContactForm(label_suffix='?')
Field.initial
forms.URLField(initial='http://')
初期値の指定。
通常通りディクショナリでフォームにデータを渡してしまうとバリデーションが働いてしまうため、エラーが出てしまう。
unbound formsでのみ表示される。
initialは入力がなかったときの初期値にはならない。あくまでも表示用。
callableを渡すことも出来るが、これは定義されたときでなく表示されたときに発動する。
Field.widget
forms.ChoiceField(label='出版社', widget=forms.RadioSelect()
フィールドにはデフォルトの入力コントロールが割り当てられているが、それを変えることができる。
- ビルトインのウイジェット
https://docs.djangoproject.com/ja/3.1/ref/forms/widgets/#built-in-widgets
TextInput,NumberInput,DateInput,FileInputなど
- デフォルトのウイジェットはこちらで確認
https://docs.djangoproject.com/ja/3.1/ref/forms/fields/#built-in-fields
BooleanField,CharField,ChoiceField,FileField,ImageField,IntegerFieldなどなど
Field.help_text
sender = forms.EmailField(help_text='A valid email address, please.')
as_ul()などを使うときにフィールドの隣に表示される説明文。
Field.error_message
forms.CharField(error_messages={'required': 'Please enter your name'})
デフォルトのエラーメッセージを上書きする。
Field.validators
even_field = models.IntegerField(validators=[validate_even])
フィールドに対するバリデーション関数で、モデルでもフォームでも使えます。
自作もできるし、ビルトイン関数もあります。
Field.localize
revenue = forms.DecimalField(max_digits=4, decimal_places=2, localize=True)
そのフィールドがローカライズを有効にするかどうかを指定する。
USE_L10N, USE_I18N などを有効にする、
テンプレートで{% localize %} ブロックを使用してコントロールする、
翻訳ファイルをformats/en/formats.pyに置いて使用するなど。
Field.disabled
Trueにセットするとユーザーが編集できないように表示するとともに、仮にサーバに送られても無視します。
Form.has_changed()
フィールドが変更されたかどうか。
まとめ
モデルクラスとフォームクラスの分担をどうするか。モデルの方はDBの都合を意識して、フォームの方は画面の都合を意識するか。
重要なのはウイジェットの選択とバリデーションでしょうか。