<p>因为您使用的是自定义用户模型,所以实现此功能的一个好方法是创建一个新表单<code>ChangePassword</code>:</p>
<pre><code>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.
</code></pre>
<p>您可以定义<code>clean()</code>来检查两个密码是否匹配,并且输入的新密码与旧密码不同。</p>
<p>如果你不想让用户使用他们之前使用过的密码</p>
<ol>
<li>创建新字段(如果要将这些密码存储为纯字符串)</li>
<li>创建一个包含先前散列密码的模型(以提高安全性)。</li>
</ol>
<p>根据您的型号,您没有加密密码,因此选项1对您很好。如果你想加密你可以选择sha256为它,库是passlib;只要搜索谷歌。</p>
<p>要实现选项1,只需向模型中添加一个字段,并且每当更改密码时,都将旧密码附加到此字段内容。您可以使用<code>CharField</code>,但它的最大长度只有255,而您可以选择<code>textfield</code>,对于您的模型,它将如下所示:</p>
<pre><code>class Members(models.Model):
#rest fields..
old_passwords=models.TextField(blank=True,default='')
</code></pre>
<p>现在,在保存ChangePassword时,使用已清理的数据更新成员密码:</p>
<pre><code>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..
</code></pre>
<p>代码只是帮助你理解你需要做什么,你必须用你自己的方式去做!</p>