如何在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
相关产品推荐
相关产品推荐

