96 Stimmen

Django: Model Form "Objekt hat kein Attribut 'cleaned_data'"

Ich versuche, ein Suchformular für eine meiner Klassen zu erstellen. Das Modell des Formulars lautet:

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"]

Und die Ansicht, die ich verwende, ist:

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

Das Formular wird ordnungsgemäß angezeigt, aber wenn ich es absende, erhalte ich einen Fehler: 'SearchForm' object has no attribute 'cleaned_data'

Ich bin mir nicht sicher, was los ist, kann mir jemand helfen? Vielen Dank!

215voto

Daniel Roseman Punkte 565786

Aus irgendeinem Grund instantiiert du das Formular erneut, nachdem du is_valid() überprüft hast. Formulare erhalten nur ein cleaned_data-Attribut, wenn is_valid() aufgerufen wurde, und du hast es bei dieser neuen, zweiten Instanz nicht aufgerufen.

Lass einfach das zweite form = SearchForm(request.POST) weg und alles sollte gut sein.

9voto

hughdbrown Punkte 45214

Ich würde den Code so schreiben:

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

Ziemlich ähnlich wie die Dokumentation.

2voto

subramanyam Punkte 51

Manchmal vergessen wir, wenn wir das

return self.cleaned_data 

im clean-Funktion von Django-Formularen, werden wir keine Daten haben, obwohl form.is_valid() True zurückgibt.

1voto

Ich hatte das gleiche Problem, Ich habe den Code so geändert

 if request.method == "POST":
     form = forms.RegisterForm(request.POST)
         if form.is_valid():
             username = form.cleaned_data.get('username')
             fname = form.cleaned_data.get('fname')
             lname = form.cleaned_data.get('lname')
             email = form.cleaned_data.get('email')
             pass1 = form.cleaned_data.get('pass1')
             pass2 = form.cleaned_data.get('pass2')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X