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 用户能够:
- 在管理面板中添加一个 Post 模型实例
- 删除管理面板中的任何 Post 模型实例
- 在管理面板中查看任何 Post 模型实例
- 编辑
Posts
管理面板中的字段
我知道 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_adm
到True
则给出所有权限,否则给出默认权限值
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
.
的自定义 User
的 has_perm
方法
如果用户具有 is_adm
到 True
并且对象是 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)
在我的 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 用户能够:
- 在管理面板中添加一个 Post 模型实例
- 删除管理面板中的任何 Post 模型实例
- 在管理面板中查看任何 Post 模型实例
- 编辑
Posts
管理面板中的字段
我知道 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_adm
到True
则给出所有权限,否则给出默认权限值
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
.
User
的 has_perm
方法
如果用户具有 is_adm
到 True
并且对象是 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)