Django .is_superuser字段权限

时间:2013-07-18 13:04:36

标签: python django django-models django-admin

默认情况下,通过运行manage.py createsuperuser命令从项目目录中我可以创建超级用户,但.is_superuser标志是默认的django标志,以区别超级用户或其他用户。

我不想使用它,因为我在整个应用程序中使用该标志来显示设置菜单。相反,我在userprofile models中添加了一个字段,字段为.is_primary_user

有没有办法控制它,所以如果我运行createsuperuser评论,它应该在.is_primary_user模型中将userprofile字段更新为“1”?

2 个答案:

答案 0 :(得分:4)

是的,您必须捕获用户模型的post_save的信号,如果更改了.is_superuser,您还需要更改.is_primary_user

Brian Neal指出,您不应该在应用程序中使用.is_superuser标志。它应该与Django权限系统一起使用(超级用户拥有所有权限)和/或Django admin。

编辑:我没有测试过,但它应该是这样的:

from django.db.models.signals import pre_save
from django.contrib.auth import User

# method for updating
def update_primary_user(sender, instance, **kwargs):
     if instance.pk:
          return
     if instance.is_superuser and not instance.userprofile.is_primary_user:
          instance.userprofile.is_primary_user = True
          instance.userprofile.save()

# register the signal
pre_save.connect(update_primary_user, sender=User)

答案 1 :(得分:1)

我看到它有两个选项。一个是关于配置文件和用户的帖子保存信号。另一种是覆盖配置文件保存方法。后者只会处理新用户。

用户模型或配置文件模型的post save signal可用于更新配置文件模型is_primary_user。然后,不仅在运行createsuperuser程序时,您可以相应地更新配置文件,但如果您授予现有用户超级用户权限,它还将更新该用户配置文件。使用用户模型信号的问题是可能尚未创建配置文件。您可能需要捕获两种模型的信号。一个用于更新用户(用户模型),另一个用于创建用户(配置文件模型)。

另一个选项是覆盖配置文件保存方法。您可以检查链接到的user.is_superuser,然后相应地更新is_primary_user字段。

另一方面,您可能希望仅为创建的第一个超级用户执行此操作,在这种情况下,您首先需要检查以前是否存在任何超级用户。

我同意另外两张海报,最好不要以这种方式使用is_superuser标志。