2017-06-01 84 views
0

每当我试图改变我的密码作为登录的用户,我收到一个AttributeError。我使用Django的内置PasswordChangeForm。谁能帮忙?Django的PasswordChangeForm AttributeError的:“PasswordChangeForm”对象有没有属性“cleaned_data”

这里是我的views.py:

from django.shortcuts import render, redirect 
from accounts.forms import (
    RegistrationForm, 
    EditProfileForm 
) 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import (
    UserChangeForm, 
    PasswordChangeForm 
) 

# Create your views here. 
def home(request): 
    numbers = [1,2,3,4,5] 
    name = 'Matthew Zayas' 
    args = {'myName': name, 'numbers': numbers} 
    return render(request, 'accounts/home.html') 

def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return redirect('/account') 
    else: 
     form = RegistrationForm() 
     args = {'form': form} 
     return render(request, 'accounts/reg_form.html', args) 

def view_profile(request): 
    args = {'user': request.user} 
    return render(request, 'accounts/profile.html', args) 

def edit_profile(request): 
    if request.method == 'POST': 
     form = EditProfileForm(request.POST, instance=request.user) 

     if form.is_valid: 
      form.save() 
      return redirect('/account/profile') 
    else: 
     form = EditProfileForm(instance=request.user) 
     args = {'form': form} 
     return render(request, 'accounts/edit_profile.html', args) 

def change_password(request): 
    if request.method == 'POST': 
     form = PasswordChangeForm(data=request.POST, user=request.user) 

     if form.is_valid: 
      form.save() 
      return redirect('/account/profile') 
    else: 
     form = PasswordChangeForm(user=request.user) 
     args = {'form': form} 
     return render(request, 'accounts/change_password.html', args) 

这里是我收到的回溯:

Environment: 


Request Method: POST 
Request URL: http://127.0.0.1:8000/account/change-password/ 

Django Version: 1.10 
Python Version: 2.7.10 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'accounts'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "/xxxxx/Desktop/env1/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/xxxxx/Desktop/env1/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/xxxxx/Desktop/env1/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/xxxxx/Desktop/env1/diversely/accounts/views.py" in change_password 
    51.   form.save() 

File "/xxxxx/site-packages/django/contrib/auth/forms.py" in save 
    331.   password = self.cleaned_data["new_password1"] 

Exception Type: AttributeError at /account/change-password/ 
Exception Value: 'PasswordChangeForm' object has no attribute 'cleaned_data' 

我不知道我做了什么错在这里,因为大部分的工作是正在被Django处理吗?任何指针将非常感激!

+0

能否请你加你看到你的问题回溯? – Colwin

+0

确保@Colwin我添加到它原来的问题后 – mzayas

回答

0

找到你的问题。该表格只有当你调用is_valid()函数获取cleaned_data属性

你在change_password功能线不调用函数

if form.is_valid: 

变化,为(注意括号()

if form.is_valid(): 

这应该解决您的问题。

+0

这解决了我的问题!当我创建自己的表单来创建用户并编辑他们的个人资料时,我不需要添加这些括号。 是否因为Django已经定义了函数is_valid()来包含属性cleaned_data? – mzayas

+0

太棒了!很高兴我能帮上忙。你能接受答案并且赞成吗? – Colwin

+1

我还是个新手,所以投票不会公开展示,但它被记录! – mzayas

相关问题