Python Django:在基于类的视图中访问变量

Python Django:在基于类的视图中访问变量,python,django,Python,Django,我正在建立一个网站,它有一个相当基本的用户系统,你可以做一些平常的事情,比如登录,修改密码等等。我正在使用一个Django项目的例子,在这里和那里做一些修改 当用户登录后,我可以访问用户的电子邮件地址,并将其添加到模板{{request.user.email}中,将其放入页面 但在通过电子邮件发送给用户重置密码的链接中,如果用户未登录,则相同的操作将不起作用。我猜一定有可能以某种方式访问它 这是我正在使用的类视图: class RestorePasswordConfirmView(Passwor

我正在建立一个网站,它有一个相当基本的用户系统,你可以做一些平常的事情,比如登录,修改密码等等。我正在使用一个Django项目的例子,在这里和那里做一些修改

当用户登录后,我可以访问用户的电子邮件地址,并将其添加到模板
{{request.user.email}
中,将其放入页面

但在通过电子邮件发送给用户重置密码的链接中,如果用户未登录,则相同的操作将不起作用。我猜一定有可能以某种方式访问它

这是我正在使用的类视图:

class RestorePasswordConfirmView(PasswordResetConfirmView):
    template_name = 'accounts/restore_password_confirm.html'

    def form_valid(self, form):
        form.save()
        messages.success(self.request, _('Your password has been set. You may go ahead and log in now.'))
        return redirect('/')

    def get_context_data(self, **kwargs):
        context = super(RestorePasswordConfirmView, self).get_context_data(**kwargs)
        context = {**context, **host_(self.request)}
        return context

是否有任何方法可以访问
user.email
变量?

PasswordResetConfirmView
中,由于请求时未设置经过身份验证的用户,因此预计
{request.user.email}
将无法工作
{{request.user}
将持有一个
匿名用户
对象

但是,如果我们看一下
PasswordResetConfirmView
是如何实现的,我们会注意到在
PasswordResetConfirmView.dispatch()
Django将用户设置为
self
,如下所示:

@method_decorator(sensitive_post_parameters())
@method_decorator(never_cache)
def dispatch(self, *args, **kwargs):
    assert 'uidb64' in kwargs and 'token' in kwargs

    self.validlink = False
    self.user = self.get_user(kwargs['uidb64'])
这意味着您可以像上面所做的那样覆盖
get\u context\u data()
,并确保同时将用户发送到模板:

def get_context_data(self, **kwargs):
    context = super(RestorePasswordConfirmView, self).get_context_data(**kwargs)
    context = {**context, **host_(self.request)}
    context['user'] = self.user
    return context

PasswordResetConfirmView
中,
{{{request.user.email}}
将无法工作,因为请求时未设置经过身份验证的用户
{{request.user}
将持有一个
匿名用户
对象

但是,如果我们看一下
PasswordResetConfirmView
是如何实现的,我们会注意到在
PasswordResetConfirmView.dispatch()
Django将用户设置为
self
,如下所示:

@method_decorator(sensitive_post_parameters())
@method_decorator(never_cache)
def dispatch(self, *args, **kwargs):
    assert 'uidb64' in kwargs and 'token' in kwargs

    self.validlink = False
    self.user = self.get_user(kwargs['uidb64'])
这意味着您可以像上面所做的那样覆盖
get\u context\u data()
,并确保同时将用户发送到模板:

def get_context_data(self, **kwargs):
    context = super(RestorePasswordConfirmView, self).get_context_data(**kwargs)
    context = {**context, **host_(self.request)}
    context['user'] = self.user
    return context