在 Django 中创建用户和发送密码重置
Creating Users & Sending Password Resets in Django
如果已经有实质性的答案,我深表歉意,我已经搜索了很长时间,但找不到任何有用的答案。
我有一个 django 项目,它具有不同级别的帐户访问权限。我有一组 'Managers',我想让他们管理用户帐户。
我希望管理员能够为用户创建用户帐户对象。但是,我不希望他们必须处理创建密码并将其发送给用户的问题(出于显而易见的原因)。这样,管理人员可以冒充用户代表他们完成工作,而用户则保持密码控制和数据所有权。
想法是管理员创建帐户,创建帐户后,用户将收到一个密码重置表单(与 django 的开箱即用身份验证相同),允许他们设置密码。
我的代码看起来类似于下面(省略了非强制性的东西)
from django.contrib.auth.models import User
from django.contrib.auth.forms import PasswordResetForm
@manager_required
def manager_add_users(request):
add_user_form = manager_add_user_form(request.POST)
new_user_name = add_user_form.cleaned_data['user_name']
new_user_email = add_user_form.cleaned_data['user_email']
new_user = User.objects.create_user(
username = new_user_name,
email = new_user_email,
)
new_user.save()
set_password_form = PasswordResetForm({'email': new_user.email })
if set_password_form.is_valid():
print 'Reset Form Is Valid'
set_password_form.save(
request= request,
use_https=True,
from_email="support@org.com",
email_template_name='registration/password_reset_email.html')
帐户创建正确,一切运行无误。问题在于,尽管表单有效(重置表单是有效的语句打印),但它实际上并未发送重置表单。没有表格错误。
但是,在测试中,当我使用系统中已存在的地址初始化表单时,如下所示:
set_password_form = PasswordResetForm({'email':'existing_address@example.com'})
密码重置表单发送无误。所以它只适用于系统中现有的用户电子邮件地址,但是尽管已经创建了用户并调用了 .save() 方法,它仍然没有捕获它(用户在创建时被标记为 'Active',所以他们应该可以找到)
我有点不知所措。我可以想出几种方法来解决这个问题,但这似乎是最直接的方法,而且我真的不完全确定为什么它不起作用。
是的,我可以发送消息。我正在使用django的后端邮件进行测试:
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
看了一下 source code,Django 似乎忽略了请求,因为密码为空。
在保存用户之前尝试设置一个临时密码(例如使用 django.utils.crypto.get_random_string()
)。
如果已经有实质性的答案,我深表歉意,我已经搜索了很长时间,但找不到任何有用的答案。
我有一个 django 项目,它具有不同级别的帐户访问权限。我有一组 'Managers',我想让他们管理用户帐户。
我希望管理员能够为用户创建用户帐户对象。但是,我不希望他们必须处理创建密码并将其发送给用户的问题(出于显而易见的原因)。这样,管理人员可以冒充用户代表他们完成工作,而用户则保持密码控制和数据所有权。
想法是管理员创建帐户,创建帐户后,用户将收到一个密码重置表单(与 django 的开箱即用身份验证相同),允许他们设置密码。
我的代码看起来类似于下面(省略了非强制性的东西)
from django.contrib.auth.models import User
from django.contrib.auth.forms import PasswordResetForm
@manager_required
def manager_add_users(request):
add_user_form = manager_add_user_form(request.POST)
new_user_name = add_user_form.cleaned_data['user_name']
new_user_email = add_user_form.cleaned_data['user_email']
new_user = User.objects.create_user(
username = new_user_name,
email = new_user_email,
)
new_user.save()
set_password_form = PasswordResetForm({'email': new_user.email })
if set_password_form.is_valid():
print 'Reset Form Is Valid'
set_password_form.save(
request= request,
use_https=True,
from_email="support@org.com",
email_template_name='registration/password_reset_email.html')
帐户创建正确,一切运行无误。问题在于,尽管表单有效(重置表单是有效的语句打印),但它实际上并未发送重置表单。没有表格错误。
但是,在测试中,当我使用系统中已存在的地址初始化表单时,如下所示:
set_password_form = PasswordResetForm({'email':'existing_address@example.com'})
密码重置表单发送无误。所以它只适用于系统中现有的用户电子邮件地址,但是尽管已经创建了用户并调用了 .save() 方法,它仍然没有捕获它(用户在创建时被标记为 'Active',所以他们应该可以找到)
我有点不知所措。我可以想出几种方法来解决这个问题,但这似乎是最直接的方法,而且我真的不完全确定为什么它不起作用。
是的,我可以发送消息。我正在使用django的后端邮件进行测试:
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
看了一下 source code,Django 似乎忽略了请求,因为密码为空。
在保存用户之前尝试设置一个临时密码(例如使用 django.utils.crypto.get_random_string()
)。