Django AttributeError:表单对象没有属性x

时间:2017-02-13 00:16:20

标签: python django

我看到很多人已经遇到过这个错误,但我想要做的是具体的,其他问题的答案对我没有帮助。 我是Django的新手,我正在尝试创建一个带有名字,姓氏,电子邮件和密码字段的表单,并且在提交表单后,我希望所有这些都写在一个文件中。我没有User对象,我实际上并没有尝试创建一个登录页面,我只想看看如何将内容写入txt文件。

所以,我在urls.py中做到了这一点:

sysenter

然后在views.py中:

syscall

所以我在forms.py中有一个EmployeeForm:

url(r'^file/$', views.employee, name='employee')

和相关的html文件是: employee.html:

def employee(request):
    if request.method == "POST":
        form = EmployeeForm(request.POST)
        if form.is_valid():
            with open('employee.txt', 'w') as f:
                myfile = File(f)
                myfile.write('%s ... %s ... %s ... %s ' % form.first_name % form.last_name % form.email % form.password)
        return render(request, 'blog/employee_thanks.html')
    else:
        form = EmployeeForm
    return render(request, 'blog/employee.html', {'form': form})

和employee_thanks.html:

class EmployeeForm(forms.Form):
    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput())

最后,有问题的错误:

  

/ file /中的AttributeError   'EmployeeForm'对象没有属性'first_name'   请求方法:POST   请求网址:http://localhost:8000/file/   Django版本:1.10   异常类型:AttributeError   例外价值:
  'EmployeeForm'对象没有属性'first_name'

我猜这个问题介于forms.py和views.py之间,但我不知道它可能是什么。 因为我这是一个爱好,如果问题愚蠢,请不要太苛刻。 在此先感谢:)

2 个答案:

答案 0 :(得分:1)

form对象实例不具有属性first_namelast_name等,因为它们是底层对象实例的属性。

相反,您可以像这样访问first_name:

form.cleaned_data.get("first_name")

您可以在{{3}}

上阅读更多内容

答案 1 :(得分:1)

您的代码中存在一些错误。

首先,表单字段不是Form实例的属性。使用form.is_valid()进行验证后,您可以使用form.cleaned_data字典访问字段,例如

form.cleaned_data['first_name']

或更安全:

form.cleaned_data.get('first_name', '')
如果表单中没有字段,

将返回空字符串而不是引发异常。

第二个错误是字符串格式化语法错误​​:

myfile.write('%s ... %s ... %s ... %s ' % form.first_name % form.last_name % form.email % form.password)

应该是:

myfile.write('%s ... %s ... %s ... %s ' % (form.cleaned_data['first_name'], form.cleaned_data['last_name'], form.cleaned_data['email'], form.cleaned_data['password']))

应该使用要替换为字符串的值的元组。但是可以通过这样传递字典来简化它:

myfile.write('%(first_name)s ... %(last_name)s ... %(email)s ... %(password)s' % form.cleaned_data)

更好的是,使用现在首选的str.format()

myfile.write('{first_name} ... {last_name} ... {email} ... {password} '.format(**form.cleaned_data))