Django: मॉडल फॉर्म "ऑब्जेक्ट में कोई विशेषता नहीं है '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)दो बार फोन क्यों ?
ह्यूगब्रोवन

@SafwanSamsudeen मेरी टिप्पणी 10 साल पहले के रूप में स्वीकार किए गए उत्तर के रूप में एक ही बात कहती है। समस्या वास्तव में यह है कि कोड को दूसरी बार SearchForm को कॉल नहीं करना चाहिए।
हुग्डब्रोर्न

जवाबों:


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

बहुत हद तक प्रलेखन की तरह ।


खैर, वह काम करता है! क्या फॉर्म की परिभाषा स्थान में इतना अंतर है?
जोसफ

मुझे नहीं पता कि आपकी समस्या क्या थी, लेकिन मुझे लगता है कि SearchForm(request.POST)दो बार कॉल करना आवश्यक नहीं था। बाकी सिर्फ खिड़की-ड्रेसिंग है: मुझे फॉर्म निर्माण के तर्कों को मोड़ने का यह तरीका पसंद है ताकि आपको केवल एक कॉल की आवश्यकता हो।
२१:३१ पर हुग्डब्रोवन

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

2

कभी-कभी, अगर हम भूल जाते हैं

return self.cleaned_data 

django रूपों के स्वच्छ कार्य में, हमारे पास कोई डेटा नहीं होगा, हालांकि form.is_valid()वापस आ जाएगा True

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.