根据 Django 教程,您应该使用 clean_data 字典访问表单字段。我想知道为什么我不能直接访问表单的属性?我的表单验证得很好,但是当我尝试访问它时,Django 抱怨该对象没有该属性。我在下面添加了一些代码,希望能帮助诊断问题。
形式:
class CustomForm(forms.Form):
description = forms.CharField(widget = forms.TextInput(attrs = {'placeholder' : 'enter some text'}), label = "My form")
查看:
def process_form(request):
if request.method != 'POST':
raise Http404
myForm = CustomForm(request.POST)
if not myForm.is_valid():
c = RequestContext(request)
return render_to_response('home/index.html', {'form' : myForm }, c)
# debug
print 'Description: ' + myForm.description # this does NOT work
# print 'Description: ' + myForm.cleaned_data['description'] # this does work
我收到以下错误:“CustomForm”对象没有属性“description”。我是否错过了文档中说我不能这样做的内容?
如果您的表单已通过验证,则您可以访问 myFormcleaned_data:
print myForm.cleaned_data.get('description')
如果您想了解为什么无法访问myForm.description,那么您可以查看myForm的数据字典:
print myForm.__dict__
使用
django.forms
定义字段的方式只是一种方便的声明性语法;它并不能真正代表最终的 Form 类或其实例在属性方面的样子。
表单有一个 metaclass (不用太深入,元类就是使用
class
关键字声明一个类,作为 __init__
方法是使用括号创建类的实例——一个自定义的钩子)正在创建的对象(在元类的情况下,是一个 class
!),它在定义时从表单类中选取字段并将它们添加到 base_fields
字典中。当您实例化表单时,其 base_fields
会被深度复制到实例上的 fields
属性。
一个令人困惑的地方可能是您使用
.
访问要在模板中显示的字段 - 实际发生的情况是 Django 的模板引擎首先尝试使用字典式 []
访问来解析属性查找和基本表单类定义了一个 __getitem__
方法来利用这一点,从表单实例的 fields
字典中查找适当的字段,并用 BoundField
来包装它,这是一个知道如何使用来自表单实例的字段和数据的包装器。用于显示字段的表单。
您可以从 Form 实例的 fields 属性访问其字段。
myForm.fields['description']
并且可以像这样访问一些属性,例如标签:
myForm.fields['description'].label
不知道如何显示对应的值。有人有想法吗?
这是我的参考
https://docs.djangoproject.com/en/dev/ref/forms/api/#accessing-the-fields-from-the-form
您可以访问您的实地考察dict。
form.__dict__["fields"]["description"]
要在调用表单的
is_valid()
后访问值,可以使用:
myForm.cleaned_data.get('description')
要在调用
is_valid()
之前访问值,可以使用:
myForm.data['description]