diadia

興味があることをやってみる。自分のメモを残しておきます。

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