You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django类视图中获取userid并传递用户头像上下文数据

实现方法

首先先修正你原有代码的笔误:类视图绑定表单的属性是form_class,不是from_class,拼写错误会导致你的自定义表单不生效。

类视图中不需要额外获取userID,直接通过self.request就能拿到和函数视图完全一致的request对象,当前登录用户可以通过self.request.user直接获取。要把头像数据传入模板上下文,只需要重写get_context_data方法即可:

from django.contrib.auth.views import PasswordChangeView
from django.urls import reverse_lazy
from .models import UserComplement
from .forms import PasswordChangingForm

class PasswordsChangeView(PasswordChangeView):
    form_class = PasswordChangingForm
    success_url = reverse_lazy("base:password/passwordsuccess")

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        try:
            user_complement = UserComplement.objects.get(pk=self.request.user.id)
            context["img_avatar"] = user_complement.avatar_image
        except UserComplement.DoesNotExist:
            pass
        return context

如果你是需要在密码修改成功后的跳转页面passwordsuccess.html中使用头像数据,不需要从修改密码的类视图传值,两种方案可选:

  • 保留你之前写的password_success函数视图即可,函数视图本身就能通过request.user拿到当前登录用户,逻辑不需要改动,直接把success_url指向这个函数视图的路由就行。
  • 如果不想保留单独的成功页视图,可以重写form_valid方法,密码修改完成后直接渲染成功页,不走重定向:
from django.shortcuts import render

def form_valid(self, form):
    form.save()
    context = {}
    try:
        user_complement = UserComplement.objects.get(pk=self.request.user.id)
        context["img_avatar"] = user_complement.avatar_image
    except UserComplement.DoesNotExist:
        pass
    return render(self.request, "registration/passwordsuccess.html", context)

注意:不要把userID拼接到跳转URL中传递,既存在越权风险也完全没有必要,所有登录校验通过的视图,都可以直接从request对象中获取当前登录的用户信息。

内容的提问来源于stack exchange,提问作者Luiz Arthur Carvalho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:54:19