2010-11-29 30 views
55

मैं अपनी कक्षाओं में से किसी एक के लिए एक खोज फ़ॉर्म बनाने की कोशिश कर रहा हूं। फार्म के मॉडल है: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

क्यों 'फॉर्म = सर्चफॉर्म (request.POST)' दो बार कॉल करें? – hughdbrown

उत्तर

118

किसी कारण से, आप is_valid() जांचने के बाद फ़ॉर्म को फिर से चालू कर रहे हैं। प्रपत्र केवल cleaned_data विशेषता प्राप्त करते हैं जब is_valid() कहा जाता है, और आपने इसे इस नए, दूसरे उदाहरण पर नहीं कहा है।

बस दूसरे form = SearchForm(request.POST) से छुटकारा पाएं और सभी को अच्छी तरह से होना चाहिए।

+0

आह, यह बताता है। बहुत बहुत धन्यवाद, सिर्फ एक मूर्ख निरीक्षण। – Joseph

+4

अत्यंत महत्वपूर्ण विस्तार धन्यवाद – soField

4

मैं इस तरह कोड लिखने होगा।

+0

अच्छा, यह काम करता है! क्या फॉर्म की परिभाषा स्थान उसमें बहुत अंतर डालता है? – Joseph

+0

मुझे नहीं पता कि आपकी समस्या क्या थी, लेकिन मुझे लगता है कि 'सर्चफॉर्म (request.POST)' को दो बार कॉल करना जरूरी नहीं था। बाकी खिड़की-ड्रेसिंग है: मुझे फॉर्म निर्माण तर्कों को तब्दील करने के इस तरह की तरह है ताकि आपको केवल एक कॉल की आवश्यकता हो। – hughdbrown

+0

या बिल्कुल क्या @ डैनियल रोज़मन ने कहा। अगर मैं आप थे, तो मैं उन्हें पसंदीदा उत्तर के रूप में चुनूंगा क्योंकि वह सटीक कारण की पहचान करता है। – hughdbrown

1

समय में, अगर हम

return self.cleaned_data 
Django रूपों में से स्वच्छ समारोह में

भूल जाते हैं, हम किसी भी डेटा हालांकि form.is_valid()True वापस आ जाएगी ज़रूरत नहीं होगी।

संबंधित मुद्दे