通过kwargs

时间:2015-12-06 13:29:25

标签: django django-class-based-views formview kwargs

我一直在努力将我的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;对象不支持项目分配

有人能帮我解释一下我做错了什么,并推动我朝着正确的方向解决这个问题吗?提前谢谢!

1 个答案:

答案 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)