Django 删除超级用户。

85

这可能是一个重复的问题,但我找不到任何相关问题,所以我会提出这个问题:

有没有一种简单的方式可以通过终端删除超级用户,类似于Django的createsuperuser命令?


1
惊人的是 - 看起来它不是一个重复项。我快速检查了一下... - OldTinfoil
7个回答

136

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

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

5
听起来像是一个愚蠢的问题,但为什么没有内置命令来做这件事呢? - KhoPhi
2
这并不是一个愚蠢的问题,如果你找到了答案,请告诉我。 - user4988789
9
在Django 1.11中,它看起来仍然是准确的,除了第一行应该改成 python manage.py shell - ericksonla

7
对于自定义用户模型,它应该是这样的:
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()

4
一个针对那些没有使用Django的User模型而是替换了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()

2
这让我走上了正确的道路,但对我来说是objects.get(),而不是objects.all()。 - Sublow

4

无需删除超级用户...只需创建另一个超级用户... 您可以使用与先前相同的名称创建另一个超级用户。 我忘记了超级用户的密码,因此我创建了一个具有与以前相同名称的新超级用户。


4
这对我没有用,它报告了一个错误 Error: That username is already taken. - Joe
@Youssof H. - 一样的问题,你找到解决方案/变通方法了吗? - theProCoder

2

下面是一个简单的自定义管理命令,可以添加到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


1
一种与 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()

-2

很遗憾,无法通过终端删除它,但您可以直接删除它。只需登录管理员页面,单击要删除的用户,向下滚动到底部并按删除即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接