【问题标题】:PasswordResetForm doesn't send emailPasswordResetForm 不发送电子邮件
【发布时间】:2020-03-27 08:59:56
【问题描述】:

我正在开发应用上的用户系统。除了一件事,一切都很好。

当我创建一个用户时,我会生成一个密码以保存在数据库中,并向新创建的用户发送一封电子邮件以设置他自己的密码。 所以密码在数据库中,我使用 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())

【问题讨论】:

  • 你能展示你的用户创建视图吗?
  • 我更新了原文
  • 保存PasswordResetForm 时,用户尚未保存。所以 save 方法不会做任何事情,因为它会在提交电子邮件的数据库中获取用户。将有关密码重置的代码移至 在保存用户之后

标签: django django-forms django-views


【解决方案1】:

当您保存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
    ...

【讨论】:

  • 是的......是的,是的......我觉得自己很愚蠢:D感谢您的帮助
猜你喜欢
  • 2011-09-16
  • 1970-01-01
  • 2015-03-09
  • 2014-08-17
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
相关资源
最近更新 更多