如何在Django类视图中限制用户仅访问自身账户页面?
解决方法
方法一:重写get_object方法
在MyAccountView中重写get_object方法,获取目标用户对象后验证是否与当前登录用户一致,不一致则抛出权限拒绝异常:
from django.core.exceptions import PermissionDenied from django.views.generic import DetailView from .models import CustomUser class MyAccountView(DetailView): model = CustomUser def get_object(self, queryset=None): obj = super().get_object(queryset) if obj != self.request.user: raise PermissionDenied return obj
方法二:过滤查询集get_queryset
通过限制视图的查询集仅包含当前登录用户,这样访问其他用户ID时会直接返回404(查询集中无对应对象):
from django.views.generic import DetailView from .models import CustomUser class MyAccountView(DetailView): model = CustomUser def get_queryset(self): return super().get_queryset().filter(pk=self.request.user.pk)
方法三:简化URL(推荐)
既然用户只能访问自身页面,可直接移除URL中的<int:pk>参数,视图内直接调用当前登录用户:
修改URL配置:
path("user/", MyAccountView.as_view(), name='my_account'),
修改视图:
from django.views.generic import DetailView from .models import CustomUser class MyAccountView(DetailView): model = CustomUser def get_object(self, queryset=None): return self.request.user
额外:添加登录验证
务必给视图加上登录限制,确保未登录用户无法访问该页面,类视图可使用LoginRequiredMixin:
from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import DetailView from .models import CustomUser class MyAccountView(LoginRequiredMixin, DetailView): model = CustomUser # 搭配上述任意一种权限验证逻辑
内容的提问来源于stack exchange,提问作者Carlitos_30
相关产品推荐
相关产品推荐

