2015-12-06 110 views
0

我一直在努力將一些額外的數據從Form類傳遞到我的視圖。對於密碼恢復,用戶必須填寫用戶名或電子郵件地址。通過kwargs將數據傳遞給FormView表單表單

def clean(self): 
    username = self.cleaned_data.get("username") 
    email = self.cleaned_data.get("email") 

    if username: 
     try: 
      user = User.objects.get(username__iexact=username, is_active=True) # <- to view 

     except User.DoesNotExist: 
      raise forms.ValidationError(
       self.error_messages["invalid_username"], 
       code="invalid_username" 
      ) 
    elif email: 
     try: 
      user = User.objects.get(email__iexact=email, is_active=True) # <- to view 

     except User.DoesNotExist: 
      raise forms.ValidationError(
       self.error_messages["invalid_email"], 
       code="invalid_email" 
      ) 
    else: 
     raise forms.ValidationError(
      self.error_messages["empty_form"], 
      code="empty_form" 
     ) 
    return self.cleaned_data 

當窗體已經被驗證,我想用戶數據發送到視圖:清洗時,如果他們中的一個存在於數據庫中的用戶名和密碼進行檢查。這樣可以將send_email邏輯從表單中分離出來,並且可以將一些信息添加到上下文中,以便將其呈現在模板中。

所以在我的FormView中,如果表單有效,我希望能夠使用表單中檢索到的用戶對象。

目前我已經嘗試了其他SO問題和Web示例的一些「答案」。但我不斷收到AttributeErrors,KeyErrors,'WSGIRequest'對象不支持項目分配。

我所做的最後一次嘗試是覆蓋初始化在我的表格,並在我看來,get_form_kwargs:

形式

def __init__(self, *args, **kwargs): 
    self.request = kwargs.pop('request') 
    super(RecoverPasswordForm, self).__init__(*args, **kwargs) 

def clean(self): 
    .... 
    self.request["user"] = User.objects.get(username__iexact=username, is_active=True) 

查看

def get_form_kwargs(self, **kwargs): 
    kwargs = super(RecoverPassword, self).get_form_kwargs() 
    kwargs["request"] = self.request 
    return kwargs 

導致以下錯誤

「WSGIRequest」對象不支持項目分配

有人可以給我的,我做錯了什麼解釋,並把我在正確的方向來解決這個問題?提前致謝!

回答

3

從我所瞭解的情況來看,在您驗證表單中的用戶名/電子郵件後,我認爲您正嘗試從您的視圖中向用戶發送一封重置密碼鏈接的電子郵件。接下來爲上下文添加一些信息,以便它可以在模板中呈現。

因此,這可以通過覆蓋在類如form_valid方法來完成:

def form_valid(self, form): 
    username = form.cleaned_data['username'] 
    email = form.cleaned_data['email'] 
    if username: user = User.objects.get(username__iexact=username, is_active=True) 
    else: user = User.objects.get(email__iexact=email, is_active=True) 
    send_email(user) 
    data = {'info':'give your info here'} 
    render(request, 'success.html', data) 

瞭解更多here

更新

到可以從form訪問用戶對象做如:

def clean(): 
    ... 
    self.cleaned_data["user"] = User.objects.get(username__iexact=username, is_active=True) 

在你form_valid

def form_valid(self, form): 
    user = form.cleaned_data['user'] 
    send_email(user) 
    data = {'info':'give your info here'} 
    render(request, 'success.html', data) 
+0

這的確會工作,但它意味着我必須執行兩個查詢。一個在窗體中,另一個在視圖中,這兩個都是相同的。需要Form查詢來檢查用戶名或電子郵件是否存在。如果不是,則引發validation_error。我想在我的視圖的form_valid中的Form中使用查詢的結果。 – Nrzonline

+0

@Nrzonline我編輯了我的答案 –

+0

我之前嘗試過這樣的事情,但那導致了一個不可改變的錯誤。不知道我做錯了什麼,然後...無論如何,這工作得很好。正是我在尋找的東西,非常感謝您的幫助! – Nrzonline