如何在Django 1.9中实现密码更改表单

2024-03-28 16:54:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我的python项目的url如下: https://github.com/abylikhsanov/social

我正在尝试实现密码更改表单,以便用户可以更改其密码。我如何实现它?应用程序应该跟踪以前的密码,并且不允许用户使用以前使用的密码。另外,我想实现重置密码功能。


Tags: 项目用户https功能githubcom应用程序url
3条回答

因为您使用的是自定义用户模型,所以实现此功能的一个好方法是创建一个新表单ChangePassword

class ChangePassword(forms.Form):
      old_password=forms.PasswordField()
      new_password=forms.PasswordField()
      reenter_password=forms.PasswordField()
      def clean(self):
          new_password=self.cleaned_data.get('new_password')
          reenter_password=self.cleaned_data.get('reenter_password')
          #similarly old_password
         if new_password and new_password!=reenter_password or new_password==old_password:
                #raise error
         #get the user object and check from old_password list if any one matches with the new password raise error(read whole answer you would know) 
         return self.cleaned_data #don't forget this.

您可以定义clean()来检查两个密码是否匹配,并且输入的新密码与旧密码不同。

如果你不想让用户使用他们之前使用过的密码

  1. 创建新字段(如果要将这些密码存储为纯字符串)
  2. 创建一个包含先前散列密码的模型(以提高安全性)。

根据您的型号,您没有加密密码,因此选项1对您很好。如果你想加密你可以选择sha256为它,库是passlib;只要搜索谷歌。

要实现选项1,只需向模型中添加一个字段,并且每当更改密码时,都将旧密码附加到此字段内容。您可以使用CharField,但它的最大长度只有255,而您可以选择textfield,对于您的模型,它将如下所示:

class Members(models.Model):
       #rest fields..
       old_passwords=models.TextField(blank=True,default='')

现在,在保存ChangePassword时,使用已清理的数据更新成员密码:

def change_password(request):
         if request.method=='POST':
            form=ChangePassword(request.POST)
            if form.is_valid():
                  new_pass=form.cleaned_data['new_password']
                  #get the current user object as user
                  if user.old_password=='':
                         #it's first time user is changing password
                         #populate our Members old_password_field
                         user.old_password=user.password
                  else:         
                         user.old_password=user.old_password+','+user.password
                  user.password=new_password 
                  user.save()
                  #do whatever you want to do man..

代码只是帮助你理解你需要做什么,你必须用你自己的方式去做!

为什么不使用django的内置PasswordChangeForm(django.contrib.auth.forms)。

如果您喜欢它的工作方式,只需从中使用它,或者您可以创建一个继承PasswordChangeForm的新的

    class PasswordChangeCustomForm(PasswordChangeForm):
        error_css_class = 'has-error'
        error_messages = {'password_incorrect':
                  "Το παλιό συνθηματικό δεν είναι σωστό. Προσπαθείστε   ξανά."}
        old_password = CharField(required=True, label='Συνθηματικό',
                      widget=PasswordInput(attrs={
                        'class': 'form-control'}),
                      error_messages={
                        'required': 'Το συνθηματικό δε μπορεί να είναι κενό'})

        new_password1 = CharField(required=True, label='Συνθηματικό',
                      widget=PasswordInput(attrs={
                        'class': 'form-control'}),
                      error_messages={
                        'required': 'Το συνθηματικό δε μπορεί να είναι κενό'})
        new_password2 = CharField(required=True, label='Συνθηματικό (Επαναλάβατε)',
                      widget=PasswordInput(attrs={
                        'class': 'form-control'}),
                      error_messages={
                        'required': 'Το συνθηματικό δε μπορεί να είναι κενό'})

稍后我将提供一个clean和save方法的示例

有关详细信息,请参见here

您可以查看以下文档中的“更改密码”部分。How to change password in Django。 它的工作原理如下:

  1. 导航到位于manage.py文件所在的项目

  2. $ python manage.py shell

  3. 执行以下操作:

    from django.contrib.auth.models import User
    u = User.objects.get(username__exact='john')
    u.set_password('new password')
    u.save()
    

您必须建立表单集,并在提交表单时执行此操作。

您还可以使用简单的manage.py命令:

manage.py changepassword *username*

只需输入两次新密码。

对于问题的第二部分(用户不能选择旧密码),可以创建一个表,在其中存储用户的旧密码。当用户输入新密码时,您可以在该表中检查是否可以选择它。Django有一个函数check_password,用于比较两个密码。

相关问题 更多 >