Django: Model Form “object has no attribute 'cleaned_data'”

匿名 (未验证) 提交于 2019-12-03 01:27:01

问题:

I am trying to make a search form for one of my classes. The model of the form is:

from django import forms from django.forms import CharField, ModelMultipleChoiceField, ModelChoiceField from books.models import Book, Author, Category  class SearchForm(forms.ModelForm):     authors = ModelMultipleChoiceField(queryset=Author.objects.all(),required=False)         category = ModelChoiceField (queryset=Category.objects.all(),required=False)     class Meta:         model = Book         fields = ["title"] 

And the view I'm using is:

from django.shortcuts import render_to_response, redirect, get_object_or_404 from django.template import RequestContext from books.models import Book,Author from books.forms import BookForm, SearchForm from users.models import User  def search_book(request):     if request.method == "POST":         form = SearchForm(request.POST)         if form.is_valid():             form = SearchForm(request.POST)             stitle = form.cleaned_data['title']             sauthor = form.cleaned_data['author']             scategory = form.cleaned_data['category']     else:         form = SearchForm()     return render_to_response("books/create.html", {         "form": form,     }, context_instance=RequestContext(request)) 

The form shows up fine, but when I submit it I get an error: 'SearchForm' object has no attribute 'cleaned_data'

I'm not sure what's going on, can someone help me out? Thanks!

回答1:

For some reason, you're re-instantiating the form after you check is_valid(). Forms only get a cleaned_data attribute when is_valid() has been called, and you haven't called it on this new, second instance.

Just get rid of the second form = SearchForm(request.POST) and all should be well.



回答2:

I would write the code like this:

def search_book(request):     form = SearchForm(request.POST or None)     if request.method == "POST" and form.is_valid():         stitle = form.cleaned_data['title']         sauthor = form.cleaned_data['author']         scategory = form.cleaned_data['category']         return HttpResponseRedirect('/thanks/')     return render_to_response("books/create.html", {         "form": form,     }, context_instance=RequestContext(request)) 

Pretty much like the documentation.



回答3:

At times, if we forget the

return self.cleaned_data  

in the clean function of django forms, we will not have any data though the form.is_valid() will return True.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!