2016-07-05 66 views
0

如果已经有实质性的答案,我已经搜索了很长时间,找不到任何有用的答案,我很抱歉。在Django中创建用户和发送密码重设

我有一个django项目,有不同级别的帐户访问权限。我有一组“经理”,我想让他们管理用户帐户。

我希望管理员能够为用户创建用户帐户对象。但是,我不希望他们必须处理创建密码并将其发送给用户(出于显而易见的原因)。通过这种方式,管理员可以冒充用户代表他们完成工作,用户可以维护密码控制和数据所有权。

这个想法是管理者创建账户,当账户被创建时,用户将被发送一个密码重置表单(与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="[email protected]", 
        email_template_name='registration/password_reset_email.html') 

的帐户创建正确,一切都没有错误运行。问题是,尽管表单有效(重置表单是有效的语句打印),但实际上并没有发送重置表单。没有表单错误。

然而,在测试的时候我初始化的形式与已经存在于系统中像这样的地址:

set_password_form = PasswordResetForm({'email':'[email protected]'}) 

密码重置形式发送没有错误。因此,它只适用于系统中现有的用户电子邮件地址,但尽管用户已创建并调用了.save()方法,但它仍未捕获它(用户在创建时标记为“活动”,因此它们应该是能够找到)

我有点茫然。我可以想到几种解决这个问题的方法,但这似乎是最直接的方式,我真的不完全确定它为什么不起作用。

是的,我可以发送消息。我使用的Django的后端邮件来进行测试:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 
+0

你还没有提到任何关于你的电子邮件后端。 Django本身不发送任何电子邮件,你必须配置一个电子邮件服务器。运行测试时,它会替换一个虚拟后端。您是否设置了电子邮件服务器并确认您可以实际发送电子邮件? –

+0

对不起。我使用django的后端。我想明确的是,当我提到成功地在某些测试用例中发送了邮件时,我配置了邮件服务器。我已更新问题以包含我的设置。 – rob

+0

谢谢澄清。我之所以提到它,是因为在没有设置邮件服务器的情况下,测试可以正常工作,因为Django的测试运行器替代了测试后端。 –

回答

1

source code扫视了一眼,它看起来像Django是忽略了请求,因为密码为空。

尝试在保存用户之前设置一个临时密码(使用,例如django.utils.crypto.get_random_string())。

+0

用电子邮件发送密码是一个不好的主意。使用dango-registration生成令牌并发送令牌。一旦从电子邮件中点击了令牌,就可以读取它并提供给用户设置密码。 – dmitryro

+1

@dmitryro:你所描述的正是Django的密码重置流程的工作原理。我的答案是关于在数据库中设置临时密码,而不是在电子邮件中发送*。 –

+0

谢谢。这是绝对正确的答案。尽管没有密码创建的用户帐户是活动的,并且可能被管理员模拟,但缺少密码会阻止auth发送重置。现在看起来很明显! – rob

相关问题