0

以下のようなパスワード変更フォームがありました

フォーム.py

class PasswordChangeForm(forms.Form):
    old_password = forms.CharField(widget=forms.PasswordInput())
    new_password = forms.CharField(widget=forms.PasswordInput())
    confirm_password = forms.CharField(widget=forms.PasswordInput())

    def clean(self):
        if self.cleaned_data['new_password'] != self.cleaned_data['confirm_password']:
            raise forms.ValidationError(_('The new passwords must be same'))
        else:
            return self.cleaned_data

template.html

<form action="/save/data/" method="post">
   <div>
      <p>{{form.old_password}}</p>
      <span>{{form.old_password.errors}}</span>
   </div>
   <div>
      <p>{{form.new_password}}</p>
      <span>{{form.new_password.errors}}</span>
   </div>
   <div>
       <p>{{form.confirm_password}}</p>
      <span>{{form.confirm_password.errors}}</span>
   </div>
</form>

ビュー.py

@login_required 
def change_password(request):
    user_obj = User.objects.get(id=request.user.id)
    form = PasswordChangeForm()
    if request.method=="POST":
        form = PasswordChangeForm(reques.POST)
        #########
        Here in this part i need to check if the user given old passoword
        matched the already saved password in the database, create a password
        with the user given new password
        #########
        new_password = form.cleaned_data['new_password']
        ......
        user_obj.password = new_password 
        ..........
    return render_to_response('template.html',{'form':form})       

上記のコードで、データベースに保存されているパスワードを、ユーザーが指定した古いパスワードで確認するにはどうすればよいでしょうか?また、新しいパスワードを作成してデータベースに保存するにはどうすればよいでしょうか?

その後、パスワードが正常に変更されたことを示すメールをユーザーに送信します

4

2 に答える 2

2

ユーザーオブジェクトがあります。したがって、そのメソッドを呼び出すだけですset_password

request.user.set_password(password) 

また、データベースからユーザーを再度取得する必要はありません。不要な DB リクエストを行っています。request.userユーザーです。

ビュー全体を次のように書き換えます。

from django.shortcuts import render

@login_required 
def change_password(request):
form = PasswordChangeForm(request.POST or None)
if form.is_valid()
    if request.user.check_password(form.cleaned_data['old_password']):
        request.user.set_password(form.cleaned_data['new_password'])
        request.user.save()
        return render(request, 'success.html')
return render(request, 'template.html', {'form':form})

これは、POST データがある場合、それでフォームを初期化することを意味します。それ以外の場合は になりNoneます。フォームが有効な場合 (空のフォームは有効ではありません)、パスワードを変更して成功ページに送信します。それ以外の場合は、空のフォーム (または検証エラーのあるフォーム) をユーザーに返します。

于 2013-11-08T11:52:29.393 に答える
0

check_password メソッドで確認できます。

if request.user.check_password(form.cleaned_data['old_password']):
    request.user.set_password(form.cleaned_data['new_password'])
    request.user.save()
于 2013-11-08T11:53:37.820 に答える