通过 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)