2012-03-13 39 views
5

根据Django教程,您应该使用cleaned_data字典访问表单字段。我想知道为什么我无法直接访问表单的属性?我的表单验证很好,但是当我尝试访问它时,Django抱怨对象没有该属性。我在下面添加了一些代码,希望能帮助诊断问题。在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' 对象有没有属性 '的描述'。我在文档中错过了一些说我无法做到的事情吗?

回答

10

定义使用领域django.forms仅仅是一个方便的方式,去说话的语法;它并不真正代表最终的Form类或它的一个实例在属性方面的样子。

形式具有metaclass(没有得到过深​​进去,元类是使用class关键字作为__init__方法是使用括号创建该类的一个实例声明类 - 一个钩来定制对象是创建,在元类的情况下,它是一个class!),它在定义时间从表单类中选择Fields并将它们添加到base_fields字典中。当您实例化一个表单时,其base_fields被深度复制到该实例的fields属性。混乱的

的一点可能是,你用.访问字段显示模板 - 什么实际发生的事情是,Django的模板引擎首先尝试使用字典式[]访问,从而解决财产查找和基本形式类定义了一个__getitem__方法来利用这一点,从表单实例的fields字典中查找适当的字段并用BoundField封装它,该封装器知道如何使用字段和表单中的数据来显示字段。

15

如果您的形式进行验证,那么你可以访问myForm的 cleaned_data:

print myForm.cleaned_data.get('description') 

如果你想知道为什么你不能访问myForm.description然后就可以看到你的myForm的数据字典

print myForm.__dict__ 
+0

我知道我可以使用cleaned_data访问它。我不明白的是为什么我无法使用属性本身访问它:myForm.description。在引擎盖下究竟发生了什么,阻止我访问它? – 2012-03-13 16:20:18

3

您可以访问您的字段trought 字典

form.__dict__["fields"]["description"]