2017-06-15 61 views
1

在我的項目中,我有一個開放註冊表單,您可以在其中創建公司及其所有信息。在手動創建的用戶上強制重置密碼

之後,您可以邀請人來幫助您管理公司的信息。要做到這一點,我的想法是,當記錄的用戶添加另一個管理員時,我會使用虛假密碼手動創建用戶,並向創建的電子郵件發送重置密碼請求,以便他可以創建自己的密碼。最重要的代碼如下:

from django.contrib.auth.forms import PasswordResetForm 
... 
def create_admin(request): 
    if request.method == 'POST': 
     form = AdminForm(request.POST) 
     if form.is_valid(): 
      email = form.cleaned_data.get("email") 
      random_pass = User.objects.make_random_password() 
      user = User(username=email, email=email, password=random_pass) 
      user.save() 
      company.add_admin(user) 
      reset_form = PasswordResetForm({'email': email}) 
      reset_form.save(
       email_template_name="rh/password_reset_email.html", 
       subject_template_name="rh/password_reset_subject.txt") 
      return redirect('dashboard') 
    else: 
     form = AdminForm() 
    return render(request, 'rh/create_admin.html', {'form': form}) 

不幸的是,上面的代碼返回一個Exception Type: AttributeError 'PasswordResetForm' object has no attribute 'cleaned_data'

要注意:

  1. 我已經擁有了一個全重置密碼功能,利用Django和定製的一切模板。這就是爲什麼我試圖使這項工作這樣
  2. 我想自定義email_template_name和subject_template_name,就像在我的代碼

在此先感謝

+0

多一點上下文會有幫助。你在哪裏調用'is_valid()'?之後,表單只有'cleaned_data'。 –

+0

我相信問題不在於這個函數中看到,而是在PasswordResetForm中。儘管如此,我用全部功能更新了這個問題。 –

+0

然後你可以添加你的PasswordResetForm嗎?你在形式上壓倒乾淨嗎?如果需要,您需要返回'cleaned_data'。但看看[源代碼](https://github.com/django/django/blob/master/django/forms/forms.py),似乎clean_data應該在那裏,因爲它在full_clean方法中創建爲空字典。 –

回答

3

在評論我有點對話框後會留下回應。這兩個問題是密碼被創建和表單未被驗證的方式。此代碼應工作:

email = form.cleaned_data.get("email") 
random_pass = User.objects.make_random_password() 
user = User(username=email, email=email) 
user.set_password(random_pass) 
user.save() 
company.add_admin(user) 
reset_form = PasswordResetForm({'email': email}) 
reset_form.is_valid() 
reset_form.save(
    email_template_name="rh/password_reset_email.html", 
    subject_template_name="rh/password_reset_subject.txt") 
return redirect('dashboard') 

(請注意,在這段代碼我用的形式,而不是觀點,因爲我不知道你與做了什麼,如果此代碼不能正常工作,請更正。 )

+0

非常感謝耐心和幫助我編輯了答案,以反映功能的正確使用,而不是形式 –

+1

沒問題,很高興你得到它的工作。事實上,如果我一開始沒有看錯地方,它會變得更快:) –