エラー: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__"を使わないで記述する。