如果Django超级用户不是以非交互方式存在,如何创建它?

5jdjgkvh  于 2022-12-14  发布在  Go
关注(0)|答案(4)|浏览(149)

我想通过Bash脚本自动创建Django用户。我发现了这个片段,它几乎满足了我的需求:

echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'pass')" |\
    python manage.py shell

如果用户已经存在,我如何修改它,使它成为nop?

nle07wnf

nle07wnf1#

使用manage.py shell

您可以使用QuerySet API方法检查用户是否存在,如果不存在,则创建用户。此外,将代码放在heredoc中可能更容易:

cat <<EOF | python manage.py shell
from django.contrib.auth import get_user_model

User = get_user_model()  # get the currently active user model,

User.objects.filter(username='admin').exists() or \
    User.objects.create_superuser('admin', 'admin@example.com', 'pass')
EOF

使用自定义管理命令

另一个更易维护的方法是为Django应用添加一个自定义的management command,修改文档中的例子,编辑yourapp/management/commands/ensure_adminuser.py如下:

from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = "Creates an admin user non-interactively if it doesn't exist"

    def add_arguments(self, parser):
        parser.add_argument('--username', help="Admin's username")
        parser.add_argument('--email', help="Admin's email")
        parser.add_argument('--password', help="Admin's password")

    def handle(self, *args, **options):
        User = get_user_model()
        if not User.objects.filter(username=options['username']).exists():
            User.objects.create_superuser(username=options['username'],
                                          email=options['email'],
                                          password=options['password'])

然后,您可以从Bash脚本调用新的自定义命令,如下所示:

python manage.py ensure_adminuser --username=admin \
    --email=admin@example.com \
    --password=pass
e0uiprwp

e0uiprwp2#

即使您的应用中有自定义的用户模型,这个bash函数也能做到这一点:

create-superuser () {
    local username="$1"
    local email="$2"
    local password="$3"
    cat <<EOF | python manage.py shell
from django.contrib.auth import get_user_model

User = get_user_model()

if not User.objects.filter(username="$username").exists():
    User.objects.create_superuser("$username", "$email", "$password")
else:
    print('User "{}" exists already, not created'.format("$username"))
EOF
}

这要归功于尤金·雅马什的原创想法。

neekobn8

neekobn83#

你可以使用get_or_create()。2如果它存在,它将不做任何事情,否则它将创建一个。
您必须手动将is_staffis_superuser设置为True

yhived7q

yhived7q4#

创建两个名为DJANGO_SUPERUSER_USERNAME和DJANGO_SUPERUSER_PASSWORD的环境变量,并选择性地使用所需的值创建DJANGO_SUPERUSER_EMAIL。然后运行以下命令:

python manage.py createsuperuser --no-input

相关问题