通过 kwargs 将数据传递给 FormView 表单 Form
Passing data to FormView form Form via kwargs
我一直在努力将一些额外的数据从我的表单 class 传递到我的视图。对于密码恢复,用户必须填写用户名或电子邮件地址。清理时,检查用户名和密码是否存在于数据库中:
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 中,如果表单有效,我希望能够使用在表单中检索到的用户对象。
目前我已经尝试了很多 'answers' 其他 SO 问题和网络示例。但我不断收到 AttributeErrors、KeyErrors、'WSGIRequest' object does not support item assignment.
我最后一次尝试是覆盖我表单中的 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
导致以下错误
'WSGIRequest' object does not support item assignment
有人可以解释一下我做错了什么,并引导我朝着正确的方向解决这个问题吗?提前致谢!
据我了解,我认为您在验证表单中的 username/email 后,正试图从您的视图向用户发送一封带有重置密码 link 的电子邮件。接下来向上下文添加一些信息,以便它可以在模板中呈现。
所以这可以通过覆盖 class 中的 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)
我一直在努力将一些额外的数据从我的表单 class 传递到我的视图。对于密码恢复,用户必须填写用户名或电子邮件地址。清理时,检查用户名和密码是否存在于数据库中:
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 中,如果表单有效,我希望能够使用在表单中检索到的用户对象。
目前我已经尝试了很多 'answers' 其他 SO 问题和网络示例。但我不断收到 AttributeErrors、KeyErrors、'WSGIRequest' object does not support item assignment.
我最后一次尝试是覆盖我表单中的 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
导致以下错误
'WSGIRequest' object does not support item assignment
有人可以解释一下我做错了什么,并引导我朝着正确的方向解决这个问题吗?提前致谢!
据我了解,我认为您在验证表单中的 username/email 后,正试图从您的视图向用户发送一封带有重置密码 link 的电子邮件。接下来向上下文添加一些信息,以便它可以在模板中呈现。
所以这可以通过覆盖 class 中的 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)