我一直在努力將一些額外的數據從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」對象不支持項目分配
有人可以給我的,我做錯了什麼解釋,並把我在正確的方向來解決這個問題?提前致謝!
這的確會工作,但它意味着我必須執行兩個查詢。一個在窗體中,另一個在視圖中,這兩個都是相同的。需要Form查詢來檢查用戶名或電子郵件是否存在。如果不是,則引發validation_error。我想在我的視圖的form_valid中的Form中使用查詢的結果。 – Nrzonline
@Nrzonline我編輯了我的答案 –
我之前嘗試過這樣的事情,但那導致了一個不可改變的錯誤。不知道我做錯了什麼,然後...無論如何,這工作得很好。正是我在尋找的東西,非常感謝您的幫助! – Nrzonline