バリデーションチェックが走るところは以下の部分なので、エラーが起きたときは以下の部分をチェックするといい
①formのクラスの定義部分
update_course = CourseModelChoiceField(
label='コース',
required=False,
queryset=Course.objects.none(),
help_text='適用開始日以降のコースが選択可能です。'
)
もしオリジナルのバリデーションをチェックを作成していた場合は、そこもチェックすること。今回は以下の部分で作成した
class CourseModelChoiceField(forms.ModelChoiceField):
def to_python(self, value):
if not value:
return None
try:
return Course.objects.get(pk=value)
except Course.DoesNotExist:
raise ValidationError(self.error_messages['invalid_choice'], code='invalid_choice')
②formコンストラクタの部分
def __init__(self, *args, begin_date=None, end_date=None, update_items=None, user=None, **kwargs):
③viewのinitメソッド、def get_form_kwargs(self)
コンストラクタの設定はviewのクラスベースビュー(FormViewを引数に設定して継承しているクラス)でinitと引数が設定されている部分を見ればいい
※ポイント
バリデーションチェックはバックエンドでの処理なので、フロントエンド側のJSで値を持ってきても、画面をリロードした際のバリデーションチェックには通らないので注意。
※ポイント②
フィールドの定義とコンストラクタの使い分けについて
フィールドはそのフィールドを定義しているだけだから、動的処理をするために引数を受け取ることができない。引数を使うfilter(id=○○)も使えない
引数を使って動的処理をしたい場合はコンストラクタを使用する