我正在使用某个应用程序的用户系统。除了一件事,一切都正常。
创建用户时,我会生成一个密码以保存在数据库中,并向新创建的用户发送电子邮件以设置自己的密码。 这样密码就在数据库中了,我使用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()也是正确的,我可以在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())
答案 0 :(得分: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
...