Python Django:基于组的模型的自定义权限

Python Django:基于组的模型的自定义权限,python,django,django-models,Python,Django,Django Models,我是Django和StackOverflow的新手,所以请对我保持冷静!我会根据要求更新代码和所有内容 我目前正在研究一个系统,学生可以加入一个叫做社团的团体。这些社团与用户有着多领域的关系。我一直在想办法建立一个体系,在这个体系中,每个社会都有领导人和普通成员。领导者可以将成员提升为同事领导者,删除社会中的职位,甚至踢社会成员 我希望在如何构造(或重新构造!)我的代码的正确方向上得到一些指导。具体地说,我想知道如何合并一个具有自定义权限的“领导”用户组,如上面所述,然后可以在模板中使用。谢谢大

我是Django和StackOverflow的新手,所以请对我保持冷静!我会根据要求更新代码和所有内容

我目前正在研究一个系统,学生可以加入一个叫做社团的团体。这些社团与用户有着多领域的关系。我一直在想办法建立一个体系,在这个体系中,每个社会都有领导人和普通成员。领导者可以将成员提升为同事领导者,删除社会中的职位,甚至踢社会成员

我希望在如何构造(或重新构造!)我的代码的正确方向上得到一些指导。具体地说,我想知道如何合并一个具有自定义权限的“领导”用户组,如上面所述,然后可以在模板中使用。谢谢大家!

class Society(models.Model):
    name = models.CharField(max_length = 200)
    description = models.TextField()
    members = models.ManyToManyField(User, verbose_name=("Members"))

    def __str__(self):
        return f"{self.name}"

class SocPost(models.Model):
    title = models.CharField(max_length = 100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    society = models.ForeignKey(Society, on_delete=models.CASCADE, related_name="posts")

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'society_id':self.society.id, 'pk':self.pk})

似乎您希望您的“领导者”是管理员,在默认django用户模型中由“is_superuser”字段表示。您所描述的是Django中的典型管理活动(可以在Django管理面板中轻松完成)。通过执行
python manage.py createsuperuser
创建其中一个超级用户,然后您将可以访问管理面板,在那里您可以自定义所需的一切,并将更多用户提升到管理级别。如果你想在基本用户和管理员之间寻找某种级别的领导,你可以根据
user\u permissions
字段创建具有自定义权限的用户,该字段由某种变量表示,该变量使用1:1关系添加到django默认用户模型中。

看起来你希望你的“领导”是管理员,由默认django用户模型中的“is_superuser”字段表示。您所描述的是Django中的典型管理活动(可以在Django管理面板中轻松完成)。通过执行
python manage.py createsuperuser
创建其中一个超级用户,然后您将可以访问管理面板,在那里您可以自定义所需的一切,并将更多用户提升到管理级别。如果您希望在基本用户和管理员之间获得某种程度的领导地位,您可以创建具有自定义权限的用户,该权限取决于
用户\u权限
字段,由某种变量表示,您可以使用1:1关系将该变量添加到django默认用户模型中。

最简单的解决方案是使用:


类SocietyMembership(models.Model)
member=models.ForeignKey(用户,相关的\'u name='society \'u会员资格')
社会=模型。外键(“社会”)
is_leader=models.BooleanField(默认值=False)
阶级社会(models.Model):
name=models.CharField(最大长度=200)
description=models.TextField()
members=models.ManyToManyField(
用户,
详细名称=(“成员”),
相关的"社团",,
通过=社会成员资格
)
定义(自我):
返回f“{self.name}”
这避免了
ContentTypes
注入的额外查询,也避免了需要为每个社团创建一个领导小组,以便将权限从一个小组分离到下一个小组


更新:

模型更新:

阶级社会(models.Model):
name=models.CharField(最大长度=200)
description=models.TextField()
members=models.ManyToManyField(
用户,
详细名称=uu(“成员”),
相关的_name=“社团”,
通过=社会成员,
)
@财产
def领导人(自我):
返回self.memberships.filter(is_leader=True)
def user_是_领导人(自我,用户:用户):
返回self.memberships.filter(is_leader=True,member=user).exists()
def是_成员(自身,用户:用户):
返回self.members.filter(pk=user.id).exists()
定义(自我):
返回f“{self.name}”
def注册(self,user:user,as_leader:bool=False):
#Django>=2.2,应该是在2020年7月
add(用户,通过默认值={“is_leader”:as_leader})
def升级(自我,用户:用户)->bool:
尝试:
membership=self.memberships.get(member=user)
除SocietyMembership.DoesNotExist外:
返回错误
membership.is_leader=True
membership.save()
返回真值
def井涌(自身,用户:用户):
self.memberships.filter(member=user).delete()
具有权限检查的视图示例:

从django.views导入泛型
从django.contrib.auth.mixin导入UserPasseStMixin,LoginRequiredMixin
从…起导入模型
类SocietyList(LoginRequiredMixin,generic.ListView):
模型=模型。社会
template_name=“main/society list.html”
上下文\u对象\u name=“社团”
类SocietyDetail(UserPasseTestMixin,generic.DetailView):
模型=模型。社会
template_name=“main/society detail.html”
上下文\u对象\u name=“社会”
def测试功能(自身):
#自我客体将是社会的一个实例
如果不是hasattr(自我,“对象”):
setattr(self,“object”,self.get\u object())
返回self.object.is_成员(self.request.user)

最简单的解决方案是使用:


类SocietyMembership(models.Model)
member=models.ForeignKey(用户,相关的\'u name='society \'u会员资格')
社会=模型。外键(“社会”)
is_leader=models.BooleanField(默认值=False)
阶级社会(models.Model):
name=models.CharField(最大长度=200)
description=models.TextField()
members=models.ManyToManyField(
用户,
详细名称=(“成员”),
相关的"社团",,
通过=社会成员资格
)
定义(自我):
返回f“{self.name}”
这避免了
ContentTypes
注入的额外查询,也避免了需要为每个社团创建一个领导小组,以便将权限从一个小组分离到下一个小组


更新:

模型更新:

阶级社会(models.Model):
name=models.CharField(最大长度=200)