在扩展用户模型时更新密码时出错。为什么以及如何解决它?

时间:2015-03-12 04:20:30

标签: django django-models django-views

我有一个功能,用户可以更新他们的电子邮件密码。但是,我使用扩展模型用户在UserProfile模型中存储电子邮件密码。

这是我的错误

AttributeError at /simofa/ubah_password_email/59
'UserProfile' object has no attribute 'set_password'
Request Method: POST
Request URL:    http://localhost:8000/simofa/ubah_password_email/59
Django Version: 1.7.4
Exception Type: AttributeError
Exception Value:    
'UserProfile' object has no attribute 'set_password'
Exception Location: /home/boss/kantor/akun/simofa/views.py in ubah_password_email, line 277
Python Executable:  /usr/bin/python
Python Version: 2.7.6
Python Path:    
['/home/boss/kantor/akun',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-i386-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client',
 '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']
Server time:    Thu, 12 Mar 2015 02:30:20 +0000 

这是我的追溯:

Environment:


Request Method: POST
Request URL: http://localhost:8000/simofa/ubah_password_email/59

Django Version: 1.7.4
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'simofa',
 'accounts')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/boss/kantor/akun/simofa/views.py" in ubah_password_email
  277.                 email.set_password(user_profile.password_email)

Exception Type: AttributeError at /simofa/ubah_password_email/59
Exception Value: 'UserProfile' object has no attribute 'set_password'

这是我的模特

from django.contrib.auth.models import User
from django.db import models

class UserProfile(models.Model):

user = models.OneToOneField(User) #digunakan untuk relasi ke model User (default) alias UserProfile adalah sebagai extending model
CATEGORY_CHOICES = (
    ('admin','Admin'),
    ('user','User'),
    )
hak_akses = models.CharField(max_length=100, choices = CATEGORY_CHOICES) 
password_email = models.CharField(max_length=100, blank=True)
password_pckelas = models.CharField(max_length=100, blank=True)

# Override the __unicode__() method to return out something meaningful!
def __unicode__(self):
    return self.user.username

这是我的观点

def ubah_password_email(request, pk):
    #cek session
    if 'username' in request.session and request.session['hak_akses'] == 'user':
        user = get_object_or_404(User, pk=pk) #ambil id dengan get
        profile = UserProfile.objects.filter(user=user).first() 
        email_form = EmailForm(data=request.POST, instance=profile) #gunakan instance untuk mengambil data yang sudah ada
        users = User.objects.all()
        if request.POST:
            if email_form.is_valid():
                email = email_form.save(commit=False)
                email.set_password(user_profile.password_email)
                email.save()
                return redirect('home')
        else:
            email_form = EmailForm(instance=profile)

        data = {
                'email_form': email_form,
                'object_list': users,
        }
        return render(request, 'ubah_password_email.html', data)
    else:
        return HttpResponseRedirect('/simofa/logout')
  1. 在这种情况下如何更新我的password_email?
  2. 我非常感谢你的回复。谢谢:))

1 个答案:

答案 0 :(得分:1)

因此,您的EmailForm正在返回UserProfile模型实例,并且UserProfile上没有名为set_password的函数。我猜你真的想做:

email.user.set_password(user_profile.password_email)

因为Django auth.User模型确实包含set_password函数。