PUROGU LADESU

ポエムがメインのブログです。

【Django】フォームフィールド

フォームクラスを作る際、フィールド定義に使うオプションなど。

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])
フィールドに対するバリデーション関数で、モデルでもフォームでも使えます。
自作もできるし、ビルトイン関数もあります。

バリデータ | Django ドキュメント | Django

Field.localize

revenue = forms.DecimalField(max_digits=4, decimal_places=2, localize=True)
そのフィールドがローカライズを有効にするかどうかを指定する。
USE_L10N, USE_I18N などを有効にする、
テンプレートで{% localize %} ブロックを使用してコントロールする、
翻訳ファイルをformats/en/formats.pyに置いて使用するなど。

表示形式のローカル化 | Django ドキュメント | Django

Field.disabled

Trueにセットするとユーザーが編集できないように表示するとともに、仮にサーバに送られても無視します。

Form.has_changed()

フィールドが変更されたかどうか。

まとめ

モデルクラスとフォームクラスの分担をどうするか。モデルの方はDBの都合を意識して、フォームの方は画面の都合を意識するか。
重要なのはウイジェットの選択とバリデーションでしょうか。