在 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 视图中将表单字段作为属性访问的主要内容,如果未能解决你的问题,请参考以下文章