【问题标题】:Django delete superuserDjango删除超级用户
【发布时间】:2014-11-03 11:36:06
【问题描述】:

这可能是重复的,但我在任何地方都找不到问题,所以我会继续问:

有没有一种从终端删除超级用户的简单方法,可能类似于 Django 的createsuperuser 命令?

【问题讨论】:

  • 令人惊讶 - 看起来它不是重复的。我做了一个快速检查...

标签: python django


【解决方案1】:

没有内置命令,但您可以从 shell 轻松执行此操作:

> python manage.py shell
$ from django.contrib.auth.models import User
$ User.objects.get(username="joebloggs", is_superuser=True).delete()

【讨论】:

  • 听起来像一个愚蠢的问题,但为什么!没有内置命令吗?
  • 这不是一个愚蠢的问题,如果您找到答案,请告诉我
  • 在 Django 1.11 中,看起来这仍然是准确的,只是第一行应该是 python manage.py shell
【解决方案2】:

如果是自定义用户模型,它将是:

python manage.py shell  
from django.contrib.auth import get_user_model
model = get_user_model()
model.objects.get(username="superjoe", is_superuser=True).delete()

【讨论】:

    【解决方案3】:

    @Timmy O'Mahony 答案的一个变体是使用shell_plus(来自django_extensions)来自动识别您的用户模型。

    python manage.py shell_plus
    
    User.objects.get(
        username="joebloggs",
        is_superuser=True
    ).delete()
    

    如果用户邮箱是唯一的,也可以通过邮箱删除用户。

    User.objects.get(
        email="joebloggs@email.com",
        is_superuser=True
    ).delete()
    

    【讨论】:

      【解决方案4】:

      这是一个简单的自定义管理命令,添加到myapp/management/commands/deletesuperuser.py

      from django.contrib.auth.models import User
      from django.core.management.base import BaseCommand
      from django.core.management.base import CommandError
      
      
      class Command(BaseCommand):
      
          def add_arguments(self, parser):
              parser.add_argument('username', type=str)
      
          def handle(self, *args, **options):
              try:
                  user = User.objects.get(username=options['username'], is_superuser=True)
              except User.DoesNotExist:
                  raise CommandError("There is no superuser named {}".format(options['username']))
      
              self.stdout.write("-------------------")
              self.stdout.write("Deleting superuser {}".format(options.get('username')))
              user.delete()
              self.stdout.write("Done.")
      

      https://docs.djangoproject.com/en/2.0/howto/custom-management-commands/#accepting-optional-arguments

      【讨论】:

        【解决方案5】:

        不使用 Django 用户模型的人的答案是用 Django 自定义用户模型代替。

        class ManagerialUser(BaseUserManager):
            """ This is a manager to perform duties such as CRUD(Create, Read,
             Update, Delete) """
        
            def create_user(self, email, name, password=None):
                 """ This creates a admin user object """
        
                 if not email:
                     raise ValueError("It is mandatory to require an email!")
        
                 if not name:
                     raise ValueError("Please provide a name:")
        
                 email = self.normalize_email(email=email)
                 user = self.model(email=email, name=name)
        
                 """ This will allow us to store our password in our database
                 as a hash """
                 user.set_password(password)
                 user.save(using=self._db)
        
                 return user
        
        
            def create_superuser(self, email, name, password):
                 """ This creates a superuser for our Django admin interface"""
        
                 user = self.create_user(email, name, password)
                 user.is_superuser = True
                 user.is_staff = True
                 user.save(using=self._db)
        
                 return user
        
        
        class TheUserProfile(AbstractBaseUser, PermissionsMixin):
            """ This represents a admin User in the system and gives specific permissions
         to this class. This class wont have staff permissions """
        
            # We do not want any email to be the same in the database.
            email = models.EmailField(max_length=255, unique=True)
            name = models.CharField(max_length=255)
            is_active = models.BooleanField(default=True)
            is_staff = models.BooleanField(default=False)
        
            USERNAME_FIELD = 'email'
        
            REQUIRED_FIELDS = ['name',]
        
            # CLASS POINTER FOR CLASS MANAGER
            objects = ManagerialUser()
        
            def get_full_name(self):
                """ This function returns a users full name """
        
                return self.name
        
            def get_short_name(self):
                """ This will return a short name or nickname of the admin user
                in the system. """
        
                return self.name
        
            def __str__(self):
                """ A dunder string method so we can see a email and or
                name in the database """
        
                return self.name + ' ' + self.email
        

        现在删除我们系统中注册的SUPERUSER

        python3 manage.py shell
        
        >>>(InteractiveConsole)
        >>>from yourapp.models import TheUserProfile
        >>>TheUserProfile.objects.all(email="The email you are looking for", is_superuser=True).delete()
        

        【讨论】:

        • 这让我走上了正确的道路,但对我来说是objects.get(),而不是objects.all()
        【解决方案6】:

        无需删除超级用户...只需创建另一个超级用户...您可以创建另一个与前一个同名的超级用户。 我忘记了超级用户的密码,所以我创建了另一个同名的超级用户。

        【讨论】:

        • 这对我不起作用,它报告错误Error: That username is already taken.
        • @Youssof H. - 同样,您找到解决方案/解决方法了吗
        【解决方案7】:

        没有办法从终端删除它(很遗憾),但你可以直接删除它。只需登录管理页面,点击您要删除的用户,向下滚动到底部并按删除即可。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-19
          • 2022-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 2013-04-12
          • 2021-10-13
          相关资源
          最近更新 更多