我正在尝试为我的一门课程制作一个搜索表格。表格型号为:
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'
如何解决此错误?
由于某种原因,您在检查
is_valid()
后要重新实例化表单。仅当调用 cleaned_data
时,表单才会获得 is_valid()
属性,并且您尚未在这个新的第二个实例上调用它。
只要摆脱第二个
form = SearchForm(request.POST)
,一切都会好起来的。
我会写这样的代码:
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))
与文档非常相似。
我也遇到同样的问题 我像这样更改了代码
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')
有时,如果我们忘记了
return self.cleaned_data
在 django 表单的 clean 函数中,虽然
form.is_valid()
将返回 True
,但我们不会有任何数据。
错误的另一种方式
'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()
解决了错误。