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

如何在Django中限制管理员访问用户私人日记条目?

Django日记应用:限制普通管理员仅访问自己的日记条目

你的两段代码都存在权限覆盖不完整的问题,导致无法彻底限制普通管理员的访问权限,以下是问题分析和修复方案:

问题分析

  1. 第一段代码(仅重写get_queryset):
    只限制了列表页的查询结果,但普通管理员如果知道其他用户日记的ID,直接通过URL访问编辑/详情页时,依然能查看或修改不属于自己的日记,因为没有限制单对象的操作权限。

  2. 第二段代码(仅重写has_view_permission):
    当obj=None(也就是列表页场景)时直接返回True,这会让普通管理员看到所有日记的列表,只有点击单条日记时才会被拦截,不符合“完全限制访问”的需求。

完整解决方案

需要同时重写查询集限制和所有核心权限方法,确保普通管理员从列表到单对象操作都只能接触自己的日记,超级管理员不受限制:

from django.contrib import admin
from .models import Journal

class JournalAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        # 列表页只显示当前用户(非超级管理员)的日记
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(user=request.user)

    def has_view_permission(self, request, obj=None):
        # 超级管理员可查看所有,普通管理员只能查看自己的日记
        if request.user.is_superuser:
            return True
        if obj:
            return obj.user == request.user
        # 非超级用户在列表页的权限,这里返回True是因为get_queryset已经做了过滤
        return True

    def has_change_permission(self, request, obj=None):
        # 限制修改权限:仅超级管理员或日记所属用户可修改
        if request.user.is_superuser:
            return True
        if obj:
            return obj.user == request.user
        return False

    def has_delete_permission(self, request, obj=None):
        # 限制删除权限:仅超级管理员或日记所属用户可删除
        if request.user.is_superuser:
            return True
        if obj:
            return obj.user == request.user
        return False

admin.site.register(Journal, JournalAdmin)

额外注意事项

  • 确保你的Journal模型中存在user外键字段,关联到Django的User模型,且每个日记条目都正确关联了创建它的用户。
  • 测试时请使用普通管理员账号(非superuser)验证,避免用超级管理员测试导致误判。

内容的提问来源于stack exchange,提问作者lilsnow02

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:27:58