事象と環境
事象
views.pyに書いたViewクラスのpostメソッドで、is_validを実行した。
WEBブラウザ上でどのような入力をした場合でも、is_validの結果がFalseになった。
forms.pyでバリデーションメソッドは実装していない。
以下にソースコードの抜粋を示す。
FormクラスにMetaクラスがあるが、今回の事象とは関係ない認識である。
views.py
class View(View):
def post(self, request, *args, **kwargs):
form = Form()
is_valid = form.is_valid()
print(is_valid)
...
forms.py
class Form(forms.ModelForm):
class Meta:
model = ExperimentResult
fields = ("title", "comment",)
widgets = {
'title' : forms.TextInput(attrs={'class':'text_area'}),
'comment' : forms.TextInput(attrs={'class':'text_area'})
}
環境
実行環境はdjango2.2.12、python3.7、Windows10である。
※OS、pythonバージョンは関係ないと想定される。
原因
Formクラスをインスタンス化する際に、__init__メソッドの第一引数に"request"があることを想定している。
form=FormClass()と書いたときには、__init__メソッドに"request"が渡されない。そのため、"is_valid"メソッドを実行すると、"request"が渡されていないことで、バリデーションエラーが発生し、必ずFalseが帰ってくる。
対応
Formクラスをインスタンス化する際に引数としてdata=request.POSTを入れる。
※GETメソッドの場合はrequest.GETになると想定される。
views.py
class View(View):
def post(self, request, *args, **kwargs):
form = Form(data=request.POST)
is_valid = form.is_valid()
print(is_valid)
...
上記対応後、Trueが帰ってくることを確認した。
参考