エラー:form.is_valid()の結果が常にFalseになる場合
エラー原因に対する基本的な探索方法
form.is_valid()を実行したあとには、errorsアトリビュートを実行するか、formをfor構文で各要素をprintするとエラー原因を探る事ができる。
if form.is_valid() == False: for ele in form : print(ele)
今回のエラー内容
form.is_valid()エラーが常に出てしまう問題が出ている
コード
views.py class ItemCreateView(View): def get(self, request, *args, **kwargs): context = {} form = ItemModelForm() context["form"] =form return render(request, "items/create_item.html", context) def post(self, request, *args, **kwargs): form = ItemModelForm(request.POST, request.FILES) print(form.is_valid()) if form.is_valid(): obj = form.save(commit=False) obj.user_name = request.user obj.save() print("成功した") return render(request, "items/create_item.html")
forms.py class ItemModelForm(forms.ModelForm): class Meta: model = Item fields = '__all__' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields.values(): #self.fields["user_name"].widget.attrs["class"] = "form-control" self.fields["title"].widget.attrs["class"] = "form-control" self.fields["description"].widget.attrs["class"] = "form-control" self.fields["image1"].widget.attrs["class"] = "form-control" self.fields["image1"].widget.attrs["type"] = "file"
{% block content %} <form method="post" enctype="multipart/form-data" action="{% url 'items:item_create' %}">{% csrf_token %} <!--label>{{ form.user_name.label }}</label> {{ form.user_name }} <br /--> <label>{{ form.title.label }}</label> {{ form.title }} <br /> <label>{{ form.description.label }}</label> {{ form.description }} <br /> <label>{{ form.image1.label }}</label> {{ form.image1 }} <br /> <button type="submit" class="btn btn-primary">送信</button> </form> {% endblock %}
原因
models.pyのItemにuser_nameがある。このuser_nameはviews.pyでItemオブジェクトに追加する方法をとっているので、html上でuserオブジェクトを入力するフォームを描画していなかった。しかしながらuser_nameはrequired Trueなのでuser_nameフォームが入力されない限り、is_valid()はFalseが出続ける。
解決方法
formにrequired Falseを加えたformインスタンスを生成するか、そもそもformにuser_nameを加えないように、fields="__all__"を使わないで記述する。