PasswordResetForm не отправляет электронную почту - PullRequest
0 голосов
/ 27 марта 2020

Я работаю над пользовательской системой в приложении. Все работает отлично, кроме одной вещи.

Когда я создаю пользователя, я генерирую пароль для хранения в базе данных и отправляю электронное письмо новому созданному пользователю, чтобы установить его собственный пароль. Таким образом, пароль находится в базе данных, и я использую PasswordResetForm для отправки электронного письма о восстановлении пароля.

Вот код, который я использую:

reset_password_form = PasswordResetForm(data={'email': user.email})
                if reset_password_form.is_valid():
                    reset_password_form.save(request=request,
                                             use_https=True,
                                             from_email="Webmaster@mysite.com",
                                             html_email_template_name='main/password_reset/password_reset_email.html',
                                             subject_template_name="main/password_reset/password_reset_subject.txt")

И вот проблема, нет электронной почты отправлено.

Поэтому, чтобы уточнить, я уже использую эту форму на случай, если мы нажмем «Я забыл свой пароль», и она работает очень хорошо. Таким образом, нет проблем с настройками для почтового сервера.

Кроме того, reset_password_form.is_valid () имеет значение true, я могу установить точку останова в if. User.email существует и содержит реальный и правильный адрес электронной почты.

У меня такое ощущение, что когда я вызываю save () в моей форме, оно не отправляет сообщение, я сделал ошибку, думая, что это произойдет делать?

Мое полное представление:

def adduser(request, id_user=None):
    modify_user = User.objects.get(id=id_user) if id_user is not None else None
    if request.method == 'POST':
        if modify_user is not None:
            userform = EditUserForm(request.POST, instance=modify_user)
        else:
            userform = AddUserForm(request.POST, instance=modify_user)

        profileform = AddProfileForm(request.POST, request.FILES,
                                     instance=modify_user.profile if modify_user is not None else None)

        if userform.is_valid() and profileform.is_valid():
            user = userform.save(commit=False)
            profileuser = profileform.save(commit=False)
            if modify_user is not None:
                user.save(update_fields=['username', 'first_name', 'last_name', 'email'])
            else:
                reset_password_form = PasswordResetForm(data={'email': user.email})
                if reset_password_form.is_valid():
                    reset_password_form.save(request=request,
                                             use_https=True,
                                             from_email="Webmaster@mantadivegiliair.com",
                                             html_email_template_name='main/password_reset/password_reset_email.html',
                                             subject_template_name="main/password_reset/password_reset_subject.txt")
                user.set_password(User.objects.make_random_password(length=6))
                user.save()
                profileuser.created_by = request.user
            profileuser.user = user
            profileuser.save()
            profileform.save_m2m()
            if modify_user is not None:
                messages.add_message(request, messages.SUCCESS,
                                     "{} {} has been updated".format(user.first_name, user.last_name))
            else:
                messages.add_message(request, messages.SUCCESS,
                                     "{} {} has been created".format(user.first_name, user.last_name))
            return redirect('profile', user.id)
        else:
            for field in userform.errors:
                if field == "__all__":
                    userform['confirm_password'].field.widget.attrs['class'] += ' error'
                else:
                    userform[field].field.widget.attrs['class'] += ' error'
            for field in profileform.errors:
                profileform[field].field.widget.attrs['class'] += ' error'
    else:
        userform = AddUserForm(instance=modify_user)
        profileform = AddProfileForm(instance=modify_user.profile if modify_user is not None else None)
    return render(request, 'main/add_user.html', locals())

1 Ответ

1 голос
/ 27 марта 2020

Пользователь еще не сохранен при сохранении PasswordResetForm. Таким образом, метод save() ничего не будет делать, потому что он попытается получить пользователей в базе данных с отправленным электронным письмом.

Вам просто нужно изменить порядок, в котором вы делаете вещи:

else:  # user is new user
    user.set_password(User.objects.make_random_password(length=6))
    user.save()
    reset_password_form = ...
    reset_password_form.save(...)
    profileuser.user = user
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...