Django-如何根据所选用户添加用户配置文件权限

Django- how to add user profile permissions based for selected users

在我的 Django 应用程序中,我有一个 user_profile 模型(如下)。 每个用户都有一个 is_adm 布尔值:

user_profile/models.py:

class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField('username', max_length=50, unique=True)
    email = models.EmailField('email address', unique=True)
    first_name = models.CharField(max_length=20, blank=True, null=True)
    last_name = models.CharField(max_length=20, blank=True, null=True)
    is_adm = models.BooleanField(default=False)

另外,我有一个 posts 博客文章模型。此模型有一个管理面板,您可以在其中添加新的 Post 实例。您还可以在那里更新、删除或查看其他 Post 个实例。

posts/models.py:

class Posts(models.Model):
    title = models.CharField(max_length=300, default='')
    publish_date = models.DateField(blank=True, null=True)
    author = models.CharField(max_length=300)
    copy = models.TextField(blank=True, default='')
    link = models.URLField(blank=True)
    source = models.TextField(default='', blank=True)
    published = models.BooleanField(default=False)

我希望 is_adm = True 用户能够:

我知道 Django 有权限和授权: https://docs.djangoproject.com/en/2.2/topics/auth/default/#permissions-and-authorization

但是我该如何添加这些方法,例如:has_view_permission()has_add_permission()has_change_permission()has_delete_permission()...

... for is_adm = True 用户,以便他们可以通过 Post 管理面板添加、删除、查看和更改 Post 模型实例?

我建议你两个解决方案。我对第一个很确定,因为我在个人项目中使用它。但是,我从来没有测试过第二个。

创建管理员

您可以为您的 Posts 模型创建一个特定的管理器并覆盖管理权限的方法。

以下代码如果请求的用户有is_admTrue则给出所有权限,否则给出默认权限值

from django.contrib.admin import ModelAdmin, register

@register(Posts)
class PostsAdmin(ModelAdmin):
    def has_add_permission(self, request):
        if request.user.is_adm:
            return True
        return super().has_add_permission(request)

    def has_view_permission(self, request, obj):
        if request.user.is_adm:
            return True
        return super().has_view_permission(request, obj)

    def has_change_permission(self, request, obj):
        if request.user.is_adm:
            return True
        return super().has_change_permission(request, obj)

    def has_delete_permission(self, request, obj):
        if request.user.is_adm:
            return True
        return super().has_delete_permission(request, obj)

修改您的用户

另一种解决方案可能是覆盖继承自 PermissionsMixin.

的自定义 Userhas_perm 方法

如果用户具有 is_admTrue 并且对象是 Posts.

的实例,则以下代码应授予所有权限
class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField('username', max_length=50, unique=True)
    email = models.EmailField('email address', unique=True)
    first_name = models.CharField(max_length=20, blank=True, null=True)
    last_name = models.CharField(max_length=20, blank=True, null=True)
    is_adm = models.BooleanField(default=False)

    def has_perm(self, perm, obj=None):
        if self.is_adm and isinstance(obj, Posts):
            return True
        return super().has_perm(perm, obj)