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.
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..
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': 'Το συνθηματικό δε μπορεί να είναι κενό'})
因为您使用的是自定义用户模型,所以实现此功能的一个好方法是创建一个新表单
ChangePassword
:您可以定义
clean()
来检查两个密码是否匹配,并且输入的新密码与旧密码不同。如果你不想让用户使用他们之前使用过的密码
根据您的型号,您没有加密密码,因此选项1对您很好。如果你想加密你可以选择sha256为它,库是passlib;只要搜索谷歌。
要实现选项1,只需向模型中添加一个字段,并且每当更改密码时,都将旧密码附加到此字段内容。您可以使用
CharField
,但它的最大长度只有255,而您可以选择textfield
,对于您的模型,它将如下所示:现在,在保存ChangePassword时,使用已清理的数据更新成员密码:
代码只是帮助你理解你需要做什么,你必须用你自己的方式去做!
为什么不使用django的内置PasswordChangeForm(django.contrib.auth.forms)。
如果您喜欢它的工作方式,只需从中使用它,或者您可以创建一个继承PasswordChangeForm的新的
稍后我将提供一个clean和save方法的示例
有关详细信息,请参见here
您可以查看以下文档中的“更改密码”部分。How to change password in Django。 它的工作原理如下:
导航到位于
manage.py
文件所在的项目$ python manage.py shell
执行以下操作:
您必须建立表单集,并在提交表单时执行此操作。
您还可以使用简单的
manage.py
命令:manage.py changepassword *username*
只需输入两次新密码。
对于问题的第二部分(用户不能选择旧密码),可以创建一个表,在其中存储用户的旧密码。当用户输入新密码时,您可以在该表中检查是否可以选择它。Django有一个函数check_password,用于比较两个密码。
相关问题 更多 >
编程相关推荐