【问题标题】:Django: "Form object has no attribute..." errorDjango:“表单对象没有属性......”错误
【发布时间】:2017-03-25 09:34:04
【问题描述】:

我是 Django 的新手,我正在尝试开发一个简单的 Django 应用程序,它使用表单从用户那里获取两个数字,并对这些数字进行一些操作,并使用 Http 响应打印结果。我的代码如下:

forms.py

class SimpleForm(forms.ModelForm):

    a = forms.IntegerField(label='first' )
    b = forms.IntegerField(label='second' )

    def result(self):
        return doSomething(self.a, self.b)

views.py

class MainPage(FormView):
    template_name = 'simple.html'
    success_url = '/result/'
    form_class = SimpleForm

    def form_valid(self, form):
        return HttpResponse(form.result())

但是,当我在本地主机上运行此代码时,它会给出类似的错误

SimpleForm object has no attribute 'a'

那么,可能是什么问题?如何获取用户输入以便在我的“结果”函数中使用它?

提前谢谢...

【问题讨论】:

    标签: python django django-forms django-views


    【解决方案1】:

    要访问数据,需要使用form.data

    def result(self):
        return doSomething(self.data['a'], self.data['b'])
    

    如果你在调用result之前调用了form.is_valid(),你也可以使用cleaned_data。 (因为OP使用的是FormView.form_valid,所以会自动调用)

    def result(self):
        return doSomething(self.cleaned_data['a'], self.cleaned_data['b'])
    

    【讨论】:

    • 他在form_valid() 中调用了result(),所以form.is_valid() 已经被调用了。这里最好只使用cleaned_data来确保数据验证,不是吗?
    • @Wilfried,你是对的。我错过了。我会提到这一点。感谢您的评论。
    • self.data 和 self.cleaned_data 有什么区别?我的意思是我应该更喜欢哪一个?
    • @qwerty, self.data 返回原始数据(字符串),而self.cleaned_data 根据字段类型返回转换后的数据(给定情况下为int)。
    【解决方案2】:

    form.aIntergerField(),而不是结果。您需要阅读表单的cleaned_data dict 才能访问表单字段的值。 Cleaned_data documentation

    class SimpleForm(forms.ModelForm):
    
        a = forms.IntegerField(label='first' )
        b = forms.IntegerField(label='second' )
    
        def result(self):
            return doSomething(self.cleaned_data['a'], self.cleaned_data['b'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2021-10-09
      • 2017-10-27
      • 2022-11-03
      • 1970-01-01
      • 2020-01-16
      • 2018-09-13
      相关资源
      最近更新 更多