【问题标题】:Accessing form fields as properties in a django view在 django 视图中将表单字段作为属性访问
【发布时间】: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”对象没有“描述”属性。我是否错过了文档中说我不能这样做的内容?

【问题讨论】:

    标签: python django forms validation


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2012-06-05
        • 2011-08-19
        • 2011-06-06
        • 2015-06-25
        • 1970-01-01
        • 2014-11-23
        • 2011-06-28
        • 1970-01-01
        • 2023-03-25
        相关资源
        最近更新 更多