2010-11-29 30 views
55

私のクラスの1つの検索フォームを作成しようとしています。Django:モデルフォーム "オブジェクトに属性 'cleaned_data'がありません"

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'

私は何が起こっているのか分からない、誰かが私を助けることができますか?ありがとう!ほとんどdocumentationよう

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)) 

+5

なぜ 'form = SearchForm(request.POST)'を2回呼び出すのですか? – hughdbrown

答えて

118

is_valid()をチェックした後で、何らかの理由でフォームを再インスタンス化しています。フォームはis_valid()が呼び出されたときにのみcleaned_data属性を取得し、この新しい2番目のインスタンスでは呼び出さなかった。

ちょうど第2のform = SearchForm(request.POST)を取り除き、すべてがうまくいくはずです。 form.is_valid()Trueを返しますけれども時には

+0

ああ、それはそれを説明します。ありがとう、ちょっとばかげた監視。 – Joseph

+4

非常に重要な詳細ありがとう – soField

4

は、私はこのようなコードを記述します。

+0

さて、それは動作します!フォームの定義位置はそれほど大きな違いをもたらしますか? – Joseph

+0

問題は何か分かりませんが、 'SearchForm(request.POST)'を2回呼び出す必要はないと思います。残りの部分はウィンドウドレッシングだけです。私はForm構築引数を折りたたんで、1回の呼び出しだけで済むようにします。 – hughdbrown

+0

まさにダニエル・ローズマンが言ったことです。私があなたの場合は、彼が正しい答えを選ぶと思います。正確な原因を特定しているからです。 – hughdbrown

1

、私たちはDjangoのフォームのクリーン機能で

return self.cleaned_data 

を忘れた場合は、我々はどのようなデータを持っていません。

関連する問題