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

在Django Admin面板中限制Profile模型的编辑权限

实现Django Admin中Profile的编辑权限控制

现有模型代码

class Profile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    first_name = models.CharField(_('نام'), max_length=255)
    last_name = models.CharField(_('نام خانوادگی'),max_length=255)
    image = models.ImageField(_('تصویر'),null=True, blank=True)
    description = models.TextField(_('توضیحات'),)
    created_date = jmodels.jDateTimeField(_('تاریخ ایجاد'), auto_now_add=True)
    updated_date = jmodels.jDateTimeField(_('تاریخ آخرین به روز رسانی'),auto_now=True)
    
    USERNAME_FIELD = 'user'
    REQUIRED_FIELDS = [] 

    def __str__(self) -> str:
        return self.user.email

    class Meta:
        ordering = ['-updated_date']
        verbose_name = 'پروفایل'
        verbose_name_plural = 'پروفایل ها'

@receiver(post_save, sender=User)
def save_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

解决方案:自定义Admin权限控制

要实现仅Profile所有者和超级用户能编辑的需求,需在项目的admin.py中为Profile定义自定义Admin类,重写权限控制相关方法:

from django.contrib import admin
from .models import Profile

class ProfileAdmin(admin.ModelAdmin):
    # 列表页显示字段
    list_display = ('user', 'first_name', 'last_name', 'updated_date')

    def has_change_permission(self, request, obj=None):
        # 超级用户拥有全部编辑权限
        if request.user.is_superuser:
            return True
        # 普通用户仅能编辑自己的Profile对象
        if obj is not None:
            return obj.user == request.user
        return False

    def has_view_permission(self, request, obj=None):
        # 超级用户可查看所有Profile
        if request.user.is_superuser:
            return True
        # 普通用户仅能查看自己的Profile
        if obj is not None:
            return obj.user == request.user
        return True

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        # 超级用户可见全部数据
        if request.user.is_superuser:
            return qs
        # 普通用户仅能看到自己的Profile
        return qs.filter(user=request.user)

admin.site.register(Profile, ProfileAdmin)

代码说明

  1. has_change_permission:控制编辑权限,超级用户直接通过校验,普通用户仅能修改属于自己的Profile实例。
  2. has_view_permission:控制查看权限,避免普通用户通过URL直接访问他人的Profile编辑页面。
  3. get_queryset:在Admin列表页过滤数据,普通用户只能看到自己的Profile,超级用户可见全部数据。

设置完成后,普通用户登录Admin后仅能查看和编辑自己的Profile;超级用户则拥有所有Profile的查看与编辑权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:35:11