0

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

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

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

4

2 回答 2

5

是的,你必须捕捉到 User 模型的 post_save 的信号,如果.is_superuser改变了,你也改变了.is_primary_user.

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

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

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)
于 2013-07-18T13:26:09.167 回答
1

在我看来,有两种选择。一个是关于配置文件和用户的保存后信号。另一种是覆盖配置文件保存方法。后者将只处理新用户。

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

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

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

我同意另外两个发帖者的观点,即最好不要以这种方式使用 is_superuser 标志。

于 2013-07-18T13:26:43.840 回答