2016-07-05 64 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

相關問題