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

MK_*_*Dev 14 python forms django validation

根据Django教程,您应该使用cleaning_data字典访问表单字段.我想知道为什么我不能直接访问表单的属性?我的表单验证很好,但是当我尝试访问它时,Django抱怨该对象没有该属性.我在下面添加了一些代码,希望能帮助诊断问题.

形成:

class CustomForm(forms.Form):
    description = forms.CharField(widget = forms.TextInput(attrs = {'placeholder' : 'enter some text'}), label = "My form")
Run Code Online (Sandbox Code Playgroud)

视图:

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
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:'CustomForm'对象没有属性'description'.我是否遗漏了文档中的某些内容,说我不能这样做?

Zub*_*zal 18

如果您的表单已经过验证,那么您可以访问myForm cleaning_data:

print myForm.cleaned_data.get('description')
Run Code Online (Sandbox Code Playgroud)

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

print myForm.__dict__
Run Code Online (Sandbox Code Playgroud)


Jon*_*nan 16

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

表单有一个元类(没有深入到它,一个元类是使用class关键字声明一个类作为一种__init__方法是使用括号创建一个类的实例 - 一个钩子来定制正在创建的对象,在这种情况下一个元类,是一个class!),它在定义时从表单类中选择Fields并将它们添加到base_fieldsdict中.实例化表单时,会将其base_fields深度复制到fields实例上的属性.

一个混乱点可能是你.用来访问字段以便在模板中显示 - 实际上正在发生的事情是Django的模板引擎首先尝试使用字典式[]访问来解析属性查找,而基本表单类定义了__getitem__一种利用它的方法这样,从表单实例的fieldsdict中查找相应的字段并用BoundField一个包装器包装它,该包装器知道如何使用表单中的字段和数据来显示字段.


Aje*_*K.P 5

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

myForm.fields['description']
Run Code Online (Sandbox Code Playgroud)

可以像这样访问某些属性,如标签:

myForm.fields['description'].label
Run Code Online (Sandbox Code Playgroud)

不确定如何显示对应的值。有人有主意吗?

这是我的参考

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