我一直在努力将我的Form类中的一些额外数据传递给我的观点。对于密码恢复,用户必须填写用户名或电子邮件地址。清理时,如果数据库中存在其中一个用户名和密码,则会检查用户名和密码:
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中,如果表单有效,我希望能够使用在表单中检索的用户对象。
目前我已经尝试了很多答案&#39;其他SO问题和网络示例。但我一直在获取AttributeErrors,KeyErrors,&#39; WSGIRequest&#39;对象不支持项目分配。
我最后一次尝试是覆盖我的表单中的 init ,以及我视图中的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
导致以下错误
&#39; WSGIRequest&#39;对象不支持项目分配
有人能帮我解释一下我做错了什么,并推动我朝着正确的方向解决这个问题吗?提前谢谢!
答案 0 :(得分: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)