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

Posted

技术标签:

【中文标题】在 django 视图中将表单字段作为属性访问【英文标题】:Accessing form fields as properties in a django view 【发布时间】:2012-03-29 12:51:22 【问题描述】:

根据 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”对象没有“描述”属性。我是否错过了文档中说我不能这样做的内容?

【问题讨论】:

【参考方案1】:

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

print myForm.cleaned_data.get('description')

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

print myForm.__dict__

【讨论】:

我知道我可以使用cleaned_data 访问它。我不明白为什么我不能使用属性本身访问它:myForm.description。究竟发生了什么让我无法访问它?【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

您可以访问您的字段 trought dict

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

【讨论】:

谢谢!如何设置仅显示某些表单域?我想从视图中进行。【参考方案4】:

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

myForm.fields['description']

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

myForm.fields['description'].label

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

这是我的参考

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

【讨论】:

以上是关于在 django 视图中将表单字段作为属性访问的主要内容,如果未能解决你的问题,请参考以下文章

在 django View 类中访问表单“字段”

访问模板化 Django 中的表单字段属性

Django 访问不属于表单的字段

在 Python 类中将函数作为属性访问

初始化后如何访问自定义视图属性

如果子表单在表单视图中,访问 2003 循环当前页面不起作用