Django:模型表单“对象没有属性‘cleaned_data’”

问题描述 投票:0回答:5

我正在尝试为我的一门课程制作一个搜索表格。表格型号为:

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'

如何解决此错误?

python django django-forms
5个回答
237
投票

由于某种原因,您在检查

is_valid()
后要重新实例化表单。仅当调用
cleaned_data
时,表单才会获得
is_valid()
属性,并且您尚未在这个新的第二个实例上调用它。

只要摆脱第二个

form = SearchForm(request.POST)
,一切都会好起来的。


12
投票

我会写这样的代码:

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

文档非常相似。


3
投票

我也遇到同样的问题 我像这样更改了代码

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

2
投票

有时,如果我们忘记了

return self.cleaned_data 

在 django 表单的 clean 函数中,虽然

form.is_valid()
将返回
True
,但我们不会有任何数据。


0
投票

错误的另一种方式

'MyForm' object has no attribute 'cleaned_data'
如果您尝试更新现有模型实例而不将

request.POST

 传递给 
ModelForm
 的相关子类,则可能会出现 
。例如,我们在以下情况下会收到此错误:

a = Article.objects.get(id=1)
f = ArticleForm(instance=a)
f.save()                    # <--- 'MyForm' object has no attribute 'cleaned_data'

更改为以下内容

a = Article.objects.get(id=1)
f = ArticleForm(request.POST, instance=a)
#               ^^^^^^^^^^^^  <--- must be passed
f.save()

解决了错误。

© www.soinside.com 2019 - 2024. All rights reserved.