DjangoのSuperUserを下記コマンドで作成しますよね
1 |
python manage.py createsuperuser |
username,email,passwordをターミナルと対話して入力していきます
Dockerを使用していて、イメージと一緒にsuperuserを作りたいのですが、
対話式というのがめんどう。。
Dockerfileでsuperuserが作れないので、イメージ作成した後に自分で作成しなきゃなんですよね
そこで、superuserを作成するコマンドをカスタマイズして、
(対話なしの)1行のコマンドで作成されるようにしていきます
ゴール
username,email,password をコマンドのオプションで受け取れるようにし、
コマンドのみでsuperuserを作成できるようにします
1 2 3 4 5 |
// 実装前 python manage.py createsuperuser // 実装後 python manage.py custom_createsuperuser --username admin --password 123456 --email 'admin@admin.com' |
カスタマイズしてみる
- management/commands/ とフォルダを作成していく
- 1. のフォルダ直下に custom_createsuperuser.py を作成する
で実装していきます
(実装後、ディレクトリ例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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を作成し、
下記のコードをコピペします (こちらのサイトから引用しました)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# カスタマイズ元の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のユーザが作成されました
1 2 |
// 実行するコマンド python manage.py custom_createsuperuser --username admin --password admin --email 'admin@admin.com' |
python manage.py runserver
でサーバーを起動し、管理画面からアクセスしてみましょう
Username : admin
Password : admin
でログイン出来たらOKです。
参考記事
Django
The web framework for perfectionists with deadlines.
素人基盤エンジニアがDockerでDjangoを触るシリーズ③:Django admin - Qiita
TL;DR素人基盤エンジニアがDockerでDjangoを触るシリーズ②:モデルの作成の続き。1から読みたい場合は↓こちら。素人基盤エンジニアがDockerでDjangoを触るシリーズ①:Do…
Django: エラー解決法 Unknown command: ‘~’ Type ‘manage.py help’ for usage.
Python 3.8.2、Django==3.0.5の環境で、カスタムコマンドを作成の上、python manage.py コマンド名 を実行したところ、下記のエラーが発生しコマンド処理が実行されない事象が発生。
コメント