Django : 모델 양식 "object has no attribute 'cleaned_data'"


86

내 수업 중 하나에 대한 검색 양식을 만들려고합니다. 양식의 모델은 다음과 같습니다.

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'

무슨 일이 일어나고 있는지 잘 모르겠습니다. 누군가 나를 도울 수 있습니까? 감사!


8
form = SearchForm(request.POST)두 번 전화 합니까?
hughdbrown

@SafwanSamsudeen 내 의견은 10 년 전에 정답으로 받아 들여진 대답과 같은 것을 말합니다. 문제는 코드가 SearchForm을 두 번 호출해서는 안된다는 것입니다.
hughdbrown 2010 년

답변:


184

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

두 번째 만 제거하면 form = SearchForm(request.POST)모든 것이 잘 될 것입니다.


7

다음과 같은 코드를 작성합니다.

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

문서 와 매우 비슷합니다 .


음, 작동합니다! 형태의 정의 위치가 그렇게 큰 차이를 만들까요?
Joseph

문제가 뭔지는 모르겠지만 SearchForm(request.POST)두 번 전화 할 필요는 없다고 생각 합니다. 나머지는 단지 창문 장식 일뿐입니다. 저는 Form 생성 인자를 접는이 방법을 좋아하므로 한 번의 호출 만 필요합니다.
hughdbrown

또는 @Daniel Roseman이 말한 그대로. 내가 당신이라면 그가 정확한 원인을 식별하기 때문에 선호하는 대답으로 선택하겠습니다.
hughdbrown

2

때때로 우리가 잊어 버리면

return self.cleaned_data 

(가) 비록 장고 형태의 청소 기능, 우리는 어떤 데이터가 없습니다 form.is_valid()반환합니다 True.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.