2010-11-29 7 views
55

내 수업 중 하나에 대한 검색 양식을 만들려고합니다.Django : Model Form "객체에 '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)'를 두 번 호출하는 이유는 무엇입니까? – hughdbrown

답변

118

is_valid()을 확인한 후에 어떤 이유로 양식을 다시 인스턴스화합니다. 양식은 is_valid()이 호출되고이 새로운 두 번째 인스턴스에서 호출하지 않은 경우에만 cleaned_data 속성을 가져옵니다.

그냥 두 번째 form = SearchForm(request.POST)을 없애고 모두 잘되어야합니다. form.is_valid()True를 반환하지만 때때로

+0

아, 설명해줍니다. 고마워, 바보 같은 감시. – Joseph

+4

매우 중요한 세부 감사합니다 – soField

4

는이 같은 코드를 작성합니다.

+0

글쎄, 그 작품! 양식의 정의 위치가 그 차이를 크게 만드나요? – Joseph

+0

문제가 무엇인지 모르겠지만'SearchForm (request.POST)'를 두 번 호출하는 것이 필요하지 않다고 생각합니다. 나머지는 윈도우 드레싱에 불과합니다. 폼 생성 인수를 접는 방식을 좋아해서 하나의 호출 만 필요합니다. – hughdbrown

+0

정확히 대니얼 로즈 맨이 말한 것. 내가 너라면 정확한 원인을 밝히기 때문에 그를 선호 대답으로 선택하겠다. – hughdbrown

1

, 우리는 장고 형태의 청소 기능에

return self.cleaned_data 

를 잊어 버린 경우, 우리는 모든 데이터가 없습니다.

관련 문제