5

ユーザーのパスワードをリセットするためのフォームを作成したかったのです。current_password、、そして、をとる必要がnew_passwordありconfirm_new_passwordます。新しいパスワードが一致していることを確認するための検証を行うことができます。どうすれば検証できcurrent_passwordますか?Userオブジェクトをフォームに渡す方法はありますか?

4

2 に答える 2

6

Djangoには、PasswordChangeFormインポートしてビューで使用できる機能が組み込まれています。

from django.contrib.auth.forms import PasswordChangeForm

ただし、独自のパスワードリセットビューを作成する必要はありません。django.contrib.with.views.password_changeビューとのペアがありdjango.contrib.auth.views.password_change_done、URL構成に直接フックできます。

于 2012-07-27T00:42:21.567 に答える
0

これの本当に良い例を見つけました:http://djangosnippets.org/snippets/158/

[編集]

上記のリンクを使用して、いくつかの変更を加えました。それらは以下にあります:

class PasswordForm(forms.Form):
    password = forms.CharField(widget=forms.PasswordInput, required=False)
    confirm_password = forms.CharField(widget=forms.PasswordInput, required=False)
    current_password = forms.CharField(widget=forms.PasswordInput, required=False)

    def __init__(self, user, *args, **kwargs):
        self.user = user
        super(PasswordForm, self).__init__(*args, **kwargs)

    def clean_current_password(self):
        # If the user entered the current password, make sure it's right
        if self.cleaned_data['current_password'] and not self.user.check_password(self.cleaned_data['current_password']):
            raise ValidationError('This is not your current password. Please try again.')

        # If the user entered the current password, make sure they entered the new passwords as well
        if self.cleaned_data['current_password'] and not (self.cleaned_data['password'] or self.cleaned_data['confirm_password']):
            raise ValidationError('Please enter a new password and a confirmation to update.')

        return self.cleaned_data['current_password']

    def clean_confirm_password(self):
        # Make sure the new password and confirmation match
        password1 = self.cleaned_data.get('password')
        password2 = self.cleaned_data.get('confirm_password')

        if password1 != password2:
            raise forms.ValidationError("Your passwords didn't match. Please try again.")

        return self.cleaned_data.get('confirm_password')
于 2012-07-27T00:32:06.167 に答える