2010-11-29 21 views
55

Sınıflarımdan biri için bir arama formu oluşturmaya çalışıyorum.Django: Model Formu "object özniteliği yok" temizlenmemiş_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"] 

Ve kullanıyorum görünümüdür: Formun modelidir

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

formu ince gösterir, ancak bunu gönderdiğinizde bir hata alıyorum: 'SearchForm' object has no attribute 'cleaned_data'

Neler olduğundan emin değilim, biri bana yardım edebilir mi? Teşekkürler! Hemen hemen documentation gibi

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

Neden "form = SearchForm (request.POST)' iki kez? – hughdbrown

cevap

118

Nedense, is_valid()'u denetledikten sonra formu yeniden örneklendiriyorsunuz. Formlar, yalnızca is_valid() çağrıldığında cleaned_data özniteliğini alır ve bu yeni, ikinci örnekte çağırmadınız.

Sadece ikinci form = SearchForm(request.POST)'dan kurtulun ve her şey iyi olmalı. form.is_valid()True dönecektir olsa zamanlarda

+0

Ah, bunu açıklıyor. Çok teşekkürler, sadece aptalca bir gözetim. – Joseph

+4

son derece önemli detaylar teşekkürler – soField

4

böyle kod yazmak istiyorum.

+0

Eh, bu işe yarıyor! Biçimin tanım yeri o kadar çok fark yaratıyor mu? – Joseph

+0

Sorununuzun ne olduğunu bilmiyorum, ancak iki kez 'SearchForm (request.POST)' işlevini çağırmanın gerekli olmadığını düşünüyorum. Geri kalan sadece pencere-giyinme: Form yapım argümanlarını katlamanın bu şekilde olmasını istiyorum, böylece sadece bir aramaya ihtiyacın var. – hughdbrown

+0

Ya da @Daniel Roseman'ın söylediği gibi. Eğer senin yerinde olsaydım, tercih sebebi olarak onu seçerdim çünkü kesin sebebi tanımladı. – hughdbrown

1

, biz django formlarının temiz işlevinde

return self.cleaned_data 

unutursanız, biz herhangi bir veri yoktur.

İlgili konular