在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)
代码说明
has_change_permission:控制编辑权限,超级用户直接通过校验,普通用户仅能修改属于自己的Profile实例。has_view_permission:控制查看权限,避免普通用户通过URL直接访问他人的Profile编辑页面。get_queryset:在Admin列表页过滤数据,普通用户只能看到自己的Profile,超级用户可见全部数据。
设置完成后,普通用户登录Admin后仅能查看和编辑自己的Profile;超级用户则拥有所有Profile的查看与编辑权限。
内容的提问来源于stack exchange,提问作者raya mansouri
相关产品推荐
相关产品推荐

