LoginSignup
6
2

More than 3 years have passed since last update.

Django2系でform.is_valid()の結果が常にFalseになる事象の対応

Posted at

事象と環境

事象

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が帰ってくることを確認した。

参考

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2