根据Django教程,您应该使用cleaning_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'。我是否遗漏了文档中的某些内容,说我不能这样做?
答案 0 :(得分:17)
如果您的表单已经过验证,那么您可以访问 myForm cleaning_data:
print myForm.cleaned_data.get('description')
如果您想了解无法访问 myForm.description 的原因,那么您可以看到 myForm 的数据字典:
print myForm.__dict__
答案 1 :(得分:15)
使用django.forms
定义字段的方式只是一种方便的声明性语法;它并不能真正代表最终的Form类或它的实例在属性方面的表现。
表单有一个metaclass(没有太深入,一个元类是使用class
关键字声明一个类,因为__init__
方法是创建一个类的实例使用括号 - 一个钩子来定制正在创建的对象,在元类的情况下,是class
!),它在定义时从表单类中选择Fields并将它们添加到{{1} dict。实例化表单时,会将base_fields
深度复制到实例上的base_fields
属性。
有一点困惑可能是您使用fields
访问字段以便在模板中显示 - 实际上发生的事情是Django的模板引擎首先尝试使用字典式.
访问来解析属性查找和基本表单类定义了一个__getitem__
方法来利用这一点,从表单实例的[]
字典中查找相应的字段并用fields
包装它,这是一个包装器。知道如何使用表单中的字段和数据来显示字段。
答案 2 :(得分:3)
您可以访问 dict 字段。
form.__dict__["fields"]["description"]
答案 3 :(得分:3)
您可以从其fields属性访问Form实例的字段。
myForm.fields['description']
像label这样的属性可以像这样访问:
myForm.fields['description'].label
不确定如何显示相应的值。有人有想法吗?
这是我的参考
https://docs.djangoproject.com/en/dev/ref/forms/api/#accessing-the-fields-from-the-form