程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何实现 Django 多用户类型,而一个用户可以根据他/她所从事的项目具有不同的角色?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何实现 Django 多用户类型,而一个用户可以根据他/她所从事的项目具有不同的角色??

开发过程中遇到如何实现 Django 多用户类型,而一个用户可以根据他/她所从事的项目具有不同的角色?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何实现 Django 多用户类型,而一个用户可以根据他/她所从事的项目具有不同的角色?的解决方法建议,希望对你解决如何实现 Django 多用户类型,而一个用户可以根据他/她所从事的项目具有不同的角色?有所启发或帮助;

我找不到解决我的问题的方法,希望能对此提出意见/帮助。

我想在 Django 中开发一个多用户类型模型,沿着作者使用 Django this video 的 Proxy Models 路线。

情况

我有一个 XX 项目列表(proj01proj02projXX、...)。 所有这些项目都有其特定的页面,可以通过特定的 url @H_750_9@mysite/projXX/

访问

我有多个用户:Adam、Bob、Caroline、Dany、Ed...

每个用户可以根据他们所从事的项目拥有多个角色(例如经理、开发人员、纪录片制作人、审阅者、编辑等)

用户可以根据项目拥有不同的角色。例如。 Adam 可以是 proj01 的审稿人,但可以是 proj02 的编辑,而 Bob 可以是 proj01 的编辑,但可以是 proj02 的审稿人,等等。

我开始在下面的 @H_750_9@models.py 文件中定义多种用户类型(仅限审阅者和编辑者角色):

# accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _


class User(AbstractUser):
    class Types(models.TextChoices):
        EDITOR= "EDITOR","Editor"
        REVIEWER = "REVIEWER","RevIEwer"

    base_type = Types.EDITOR

    type = models.CharFIEld(
        _("Type"),max_length=50,choices=Types.choices,default=base_type
    )

    name = models.CharFIEld(_("name of User"),blank=True,max_length=255)

    def get_absolute_url(self):
        return reverse("users:detail",kwargs={"username": self.usernamE})

    def save(self,*args,**kwargs):
        if not self.ID:
            self.type = self.base_type
        return super().save(*args,**kwargs)


class EditoRMANager(models.Manager):
    def get_queryset(self,**kwargs):
        return super().get_queryset(*args,**kwargs).filter(type=User.Types.EDITOR)


class RevIEweRMANager(models.Manager):
    def get_queryset(self,**kwargs).filter(type=User.Types.REVIEWER)


class EditorMore(models.Model):
    user = models.OnetoOneFIEld(User,on_delete=models.CASCADE)
    gadgets = models.TextFIEld()


class Editor(User):
    base_type = User.Types.EDITOR
    objects = EditoRMANager()

    class Meta:
        proxy = True

    def edit(self):
        return "Edition in progress"


class RevIEwerMore(models.Model):
    user = models.OnetoOneFIEld(User,on_delete=models.CASCADE)
    model = models.CharFIEld(max_length=255)
    make = models.CharFIEld(max_length=255)
    year = models.IntegerFIEld()


class RevIEwer(User):
    base_type = User.Types.REVIEWER
    objects = RevIEweRMANager()

    @property
    def more(self):
        return self.revIEwermore

    class Meta:
        proxy = True

    def revIEw(self):
        return "In RevIEw" 

问题:

处理用户角色可以根据他/她正在访问的项目页面改变这一事实的最佳方法是什么?

例:如果 Adam 已登录并访问页面 @H_750_9@mysite/proj01/,我希望他只能访问评论者允许的内容,而如果 Adam 访问 @H_750_9@mysite/proj02/,我希望用户只能看到允许编辑的内容。

理想情况下,我希望每个用户在用户数据库中都有其唯一的条目。我在想依赖于项目的角色级别可以存储为字典吗?例如:

{'proj01':'revIEwer','proj02':'editor','projxx': 'roleY',... } 

如何结合这个用户模型和项目相关权限列表?

编辑 02/07/21

project 应用、@H_750_9@models.py 和 vIEws.py 添加示例文件:

# projects/models.py
from django.conf import setTings
from django.contrib.auth import get_user_R_477_11845@odel
from django.db import models
from django.urls import reverse


class Project(models.Model):
    title = models.CharFIEld(max_length=255)
    body = models.TextFIEld()
    date = models.datetiR_477_11845@eFIEld(auto_Now_add=TruE)
    author = models.ForeignKey(
        get_user_R_477_11845@odel(),on_delete=models.CASCADE,)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("project_detail",args=[str(self.ID)])

# projects/vIEws.py
from django.contrib.auth.mixins import (
    Loginrequiredmixin,UserPassesTestmixin,)
from django.vIEws.generic import ListVIEw,DetailVIEw
from django.vIEws.generic.edit import updateVIEw,deleteVIEw,CreateVIEw
from django.urls import reverse_lazy
from .models import Project


class ProjectListVIEw(Loginrequiredmixin,ListVIEw):
    model = Project
    template_name = "project_List.HTML"


class ProjectDetailVIEw(Loginrequiredmixin,DetailVIEw):
    model = Article
    template_name = "project_detail.HTML"


class ProjectupdateVIEw(Loginrequiredmixin,updateVIEw):
    model = Project
    fIElds = (
        "title","body",)
    template_name = "project_edit.HTML"

    def test_func(self):
        obj = self.get_object()
        return obj.author == self.request.user

解决方法

可以参以下示例。

模型

class Project(models.Model):
    title = models.CharField(max_length=255)
 ......

class ProjectPermission(model.Model):
    project = models.ForeignKey(Project,on_delete=models.CASCADE,related_name='permissions')
    role = models.ForeignKey('Role',on_delete=models.CASCADE)
    can_add = models.BooleanField(default=falsE)
    can_review = models.BooleanField(default=falsE)
    .......

class Role(models.Model):
   name = models.CharField(max_length=50) # example Moderator etc.
   project_permissions = models.ManyToManyField(ProjectPermission)
   users = models.ManyToManyField(User)
   

观看次数

#Let's create a Project instance
proj = Project.objects.create(title="Some Project")

#let's create role and assign users to role: 
role = Role.objects.create(name='Reviewer')
# assign users 
role.users.add(user1)

现在,假设您要为 review 角色内最近创建的 proj 实例分配 Reviewer 权限:

# first create ProjectPermission 
perm = ProjectPermission.objects.create(project=proj,can_review=True,role=rolE)

# Now add this perm into the role:
role.project_permissions.add(perm)

现在终于可以查看用户权限了。

 def review_project(request,project_id):
    project = Project.objects.get(id=project_id)
    if project.permissions.filter(can_review=True,role__users=request.user).exists():
       # your code
    else:
       raise PermissionDenied
,

如果您有项目作为模型。您可以向模型添加自定义权限。然后为每个项目将这些权限适当地分配给您的用户(实际上也可以轻松添加/删除权限)。

然后在您的视图/模板中使用 user_passes_test 或 permissions_required 来限制用户可以查看/访问/编辑的内容。

    class Project(models.Model):
        # ...
        class Meta:
            permissions = (
                ("is_reviewer","Can review"),("is_editor","Can edit"),("is_manager","Can manage"),)
,
  • 创建定义您的角色的组,例如:Group1: Editor、Group2:Manager 等
  • 将每个用户分配到指定的组(您可以在 python manage.py sHell 或管理面板中进行)
  • 对视图添加限制,例如:/mysite/projx/ 视图仅限于 groupA,您可以查看以下问题对您有帮助:https://stackoverflow.com/a/4789038/13508969

例如: GroupA : GlobalEditor(Bob 可以在 projx 和 projy 中编辑,并且只能查看 projz)

GroupB : viewonly(Adam 只能查看 projs 的内容) 等等

大佬总结

以上是大佬教程为你收集整理的如何实现 Django 多用户类型,而一个用户可以根据他/她所从事的项目具有不同的角色?全部内容,希望文章能够帮你解决如何实现 Django 多用户类型,而一个用户可以根据他/她所从事的项目具有不同的角色?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。