クラスの1つに検索フォームを作成しようとしています。フォームのモデルは次のとおりです。
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"]
そして、私が使用しているビューは次のとおりです。
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))
フォームは正常に表示されますが、送信するとエラーが発生します:'SearchForm' object has no attribute 'cleaned_data'
何が起こっているのかわかりませんが、誰か助けてくれますか?ありがとう!
何らかの理由で、is_valid()
をチェックした後、フォームを再インスタンス化しています。フォームは、is_valid()
が呼び出されたときに_cleaned_data
_属性のみを取得し、この新しい2番目のインスタンスでは呼び出されていません。
2番目のform = SearchForm(request.POST)
を取り除くだけで、すべてうまくいくはずです。
私はこのようなコードを書くでしょう:
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))
documentation とほぼ同じです。
時々、
_return self.cleaned_data
_
Djangoフォームのclean関数では、form.is_valid()
はTrue
を返しますが、データはありません。