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

问题描述 投票:0回答:5

根据 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”。我是否错过了文档中说我不能这样做的内容?

python django forms validation
5个回答
26
投票

如果您的表单已通过验证,则您可以访问 myFormcleaned_data:

print myForm.cleaned_data.get('description')

如果您想了解为什么无法访问myForm.description,那么您可以查看myForm的数据字典:

print myForm.__dict__

20
投票

使用

django.forms
定义字段的方式只是一种方便的声明性语法;它并不能真正代表最终的 Form 类或其实例在属性方面的样子。

表单有一个 metaclass (不用太深入,元类就是使用

class
关键字声明一个类,作为
__init__
方法是使用括号创建类的实例——一个自定义的钩子)正在创建的对象(在元类的情况下,是一个
class
!),它在定义时从表单类中选取字段并将它们添加到
base_fields
字典中。当您实例化表单时,其
base_fields
会被深度复制到实例上的
fields
属性。

一个令人困惑的地方可能是您使用

.
访问要在模板中显示的字段 - 实际发生的情况是 Django 的模板引擎首先尝试使用字典式
[]
访问来解析属性查找和基本表单类定义了一个
__getitem__
方法来利用这一点,从表单实例的
fields
字典中查找适当的字段,并用
BoundField
来包装它,这是一个知道如何使用来自表单实例的字段和数据的包装器。用于显示字段的表单。


7
投票

您可以从 Form 实例的 fields 属性访问其字段。

myForm.fields['description']

并且可以像这样访问一些属性,例如标签:

myForm.fields['description'].label

不知道如何显示对应的值。有人有想法吗?

这是我的参考

https://docs.djangoproject.com/en/dev/ref/forms/api/#accessing-the-fields-from-the-form


4
投票

您可以访问您的实地考察dict

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

0
投票

要在调用表单的

is_valid()
后访问值,可以使用:

myForm.cleaned_data.get('description')

要在调用

is_valid()
之前访问值,可以使用:

myForm.data['description]
© www.soinside.com 2019 - 2024. All rights reserved.