在django视图中将表单字段作为属性进行访问

时间:2012-03-13 05:05:16

标签: python django forms validation

根据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'。我是否遗漏了文档中的某些内容,说我不能这样做?

4 个答案:

答案 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