Я создал форму, в которой зарегистрированные пользователи могут менять свой адрес электронной почты. После сохранения нового сообщения электронной почты, похоже, нет соответствующего запроса для комбинации адрес электронной почты и пароль. Я проверил запись базы данных для указанного c пользовательского экземпляра, и электронная почта была изменена, как и ожидалось. Даже когда я использовал django.contrib.auth.authenticate
для сопоставления электронной почты / пароля, он не мог совпадать. Что я делаю неправильно? Ниже приведены форма и представление, которые я использовал:
Forms.py
class UpdateEmailForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
new_email = forms.EmailField()
class Meta:
model = User
fields = ['new_email', 'password']
def clean(self):
cleaned_data = self.cleaned_data
old_password = cleaned_data.get('password')
if not check_password(old_password, self.instance.password):
raise forms.ValidationError('Incorrect password. Please try again.')
return cleaned_data
Views.py
def user_login(request):
form = LoginForm(request.POST)
context = {'form': form}
if request.POST.get('user_login'):
email = request.POST.get('email')
password = request.POST.get('password')
user = authenticate(email=email, password=password)
if user is not None:
login(request, user)
return redirect('profile')
else:
messages.error(request, 'Email and Password does not match.')
return redirect('login')
return render(request, 'users/login.html', context)
Ниже я рассматриваю новую форму электронной почты data @login_required def profile (request): ... elif request.POST.get ('update_email'): data = Customer.objects.get (email = request.user.email) email_form = UpdateEmailForm (request.POST, instance = request.user)
if email_form.is_valid():
email_form.save()
email = request.POST.get('new_email')
user = User.objects.get(email=request.user.email)
user.email = email
data.email = email
data.save()
user.save()
messages.success(request, 'Your account has been updated successfully')
return redirect('profile')
else:
return render(request, 'users/profile.html', {'data': data, 'email_form': email_form})