🚀

【Django】1行のコマンドでSuperUserを作成できるようにしてみる

2025/01/04に公開

Django の SuperUser を下記コマンドで作成しますよね

python manage.py createsuperuser

username,email,password をターミナルと対話して入力していきます

Docker を使用していて、イメージと一緒に superuser を作りたいのですが、 対話式というのがめんどう。。

Dockerfile で superuser が作れないので、イメージ作成した後に自分で作成しなきゃなんですよね

そこで、superuser を作成するコマンドをカスタマイズして、(対話なしの)1行のコマンドで作成されるようにしていきます

ゴール

username,email,password をコマンドのオプションで受け取れるようにし、コマンドのみで superuser を作成できるようにします

// 実装前
python manage.py createsuperuser

// 実装後
python manage.py custom_createsuperuser --username admin --password 123456 --email 'admin@admin.com'

カスタマイズしてみる

  1. management/commands/ とフォルダを作成していく
  2. 1. のフォルダ直下に custom_createsuperuser.py を作成する

で実装していきます

(実装後、ディレクトリ例)

    sampleapp
    ├── app
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── management //追加
    │   │   ├── __init__.py //追加
    │   │   └── commands //追加
    │   │       ├── __init__.py //追加
    │   │       └── custom_createsuperuser.py //追加
    │   ├── migrations
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── db.sqlite3
    ├── manage.py
    └── sampleapp

management/commands/ とフォルダを作成

アプリのフォルダ配下に management フォルダを作成し、その下に commands フォルダを作成していきます

また、作成したフォルダには必ず__init__.py を作成しましょう ※ないと、コマンドとして認識されないみたい??

1. のフォルダ直下に custom_createsuperuser.py を作成

先ほど作成したフォルダ配下に custom_createsuperuser.py を作成し、下記のコードをコピペします (こちらのサイトから引用しました)

# カスタマイズ元のcreatesuperuserをインポート
from django.contrib.auth.management.commands import createsuperuser
# 引数エラー時に使用するエラー
from django.core.management import CommandError


class Command(createsuperuser.Command):
    # --helpもしくは-hでヘルプを呼び出したときに表示される文言
    help = "Create a superuser with a password non-interactively"

    # --password という引数を追加
    # usernameやemailはcreatesuperuserにデフォルトであるため、追加不要
    def add_arguments(self, parser):
        super(Command, self).add_arguments(parser)
        parser.add_argument(
            "--password",
            dest="password",
            default=None,
            help="Specifies the password for the superuser.",
        )

    # コマンドのメインの処理
    def handle(self, *args, **options):
        # 引数の値を取得
        options.setdefault("interactive", False)
        username = options.get("username")
        email = options.get("email")
        password = options.get("password")
        database = options.get("database")

        # username,email,passwordが指定されていない場合
        # エラーを出す
        if not (username and email and password):
            raise CommandError(
                "--username, --email and --password are required options"
            )

        # 引数から受け取った値を格納
        user_data = {
            "username": username,
            "email": email,
            "password": password,
        }

        # usernameをもとにDBに存在しているか確認
        exists = (
            self.UserModel._default_manager.db_manager(database)
            .filter(username=username)
            .exists()
        )
        # 存在していなければ、superuserを作成
        if not exists:
            self.UserModel._default_manager.db_manager(
                database
            ).create_superuser(**user_data)

動作確認

では、コマンドを実行していきましょう

↓ でID/PW が admin/admin のユーザが作成されました

// 実行するコマンド
python manage.py custom_createsuperuser --username admin --password admin --email 'admin@admin.com'

python manage.py runserver

でサーバーを起動し、管理画面からアクセスしてみましょう

Username : admin

Password : admin

でログイン出来たら OK です。

参考記事

https://docs.djangoproject.com/en/4.1/howto/custom-management-commands/

https://qiita.com/LittleGreenMen/items/85d41c1fa6bb9bf4da42

https://jumpyoshim.hatenablog.com/entry/how-to-automate-createsuperuser-on-django

https://yukun.info/django-unknown-command-error/

Discussion