Мне кажется, что вы ответили на свой вопрос:)
Документы по методу check_password
находятся здесь: http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.check_password
success = user.check_password(request.POST['submitted_password'])
if success:
# do your email changing magic
else:
return http.HttpResponse("Your password is incorrect")
# or more appropriately your template with errors
Поскольку вы уже передаете запрос.user в конструкторе форм (похоже, вы переопределили __init__
по вашим собственным причинам), вы можете поместить всю свою логику в форму без каких-либо проблем.
class MyForm(forms.Form):
# ...
password = forms.CharField(widget=forms.PasswordInput)
def __init__(self, user, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.user = user
def clean_password(self):
valid = self.user.check_password(self.cleaned_data['password'])
if not valid:
raise forms.ValidationError("Password Incorrect")
return valid
обновить после просмотра ваших форм
ОК.Основная проблема в том, что __init__
был определен дважды, что делает первое утверждение бесполезным.Вторая проблема, которую я вижу, состоит в том, что мы будем делать несколько запросов для user
, когда нам действительно это не нужно.
Мы немного отклонились от вашего первоначального вопроса, но, надеюсь, это опыт обучения.
Я изменил только несколько вещей:
- Удалено дополнительное
__init__
определение - Изменено
__init__
для принятия User
экземпляра вместо текста username
- Удален запрос для
User.objects.get(username=username)
, так как мы передаемпользовательский объект.
Просто не забудьте передать конструктор формы user=request.user
вместо username=request.user.username
class EmailChangeForm(forms.Form):
email = forms.EmailField(label='New E-mail', max_length=75)
password = forms.CharField(widget=forms.PasswordInput)
def __init__(self, user=None, *args, **kwargs):
self.user = user
super(EmailChangeForm, self).__init__(*args, **kwargs)
def clean_password(self):
valid = self.user.check_password(self.cleaned_data['password'])
if not valid:
raise forms.ValidationError("Password Incorrect")
def clean_email(self):
email = self.cleaned_data.get('email')
# no need to query a user object if we're passing it in anyways.
user = self.user
# Check if the new email address differs from the current email address.
if user.email == email:
raise forms.ValidationError('New email address cannot be the same \
as your current email address')
return email
Наконец, поскольку здесь мы говорим о хорошей практике,Я бы порекомендовал выполнить предложения Skirmantas о переносе кода текущего представления в метод формы, чтобы вы могли просто вызвать myform.send_confirmation_email
.
Звучит как хорошее упражнение!