Django

Django 簡単なアプリを作って基礎を覚える① スーパーユーザー作成とマイグレ

Djangoを覚えるために少し簡単なアプリを作ってみると理解が進みやすいと思います。

これから何回かに分けて、Todoアプリを作りながら基礎を学習しましょう!

Django 簡単なアプリを作って基礎を学ぶ

環境構築からプロジェクト作成まで

環境構築については、下の記事を参考にして作成してください。ただし、Djangoのプロジェクト作成での名称は、『testproject』としてください。

Pythonをはじめよう
PythonとDjangoを使ってWebアプリを作ろう!まずは環境づくり!

Djnagoをはじめようと思った時に、最初に悩んだのは、コード書くためのツールです。Django開発の有名なエディタは、「pycharm」と「Visual code Studio」です。 色々調べてみ ...

続きを見る

django-admin startproject testproject .

プロジェクトが正しく作成できているか、サーバーを起動させて確認してみましょう。

python manage.py runserver

注意ポイント

ここでエラーが出る場合は、python manage.py runserver を python3 manage.py runserver で実行してみてください。

動作した場合、python 部分を python3 と今後は入力してください

問題がなければ、画面にこんな感じで表示されます。

PS C:\Users\hdj16\Desktop\Test> python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
May 05, 2021 - 08:03:49
Django version 3.1.8, using settings 'testproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

http://127.0.0.1:8000/をChromeやEdgeなどのブラウザで開くことができますので、開いてみるとロケットが飛んでいてサーバーが正しく起動していることが確認することができます。

この画面がでることが、最初は感動しました!

プログラミングを続けるコツは、ひとつできるようになったら、すごく感動して喜びを感じることだとおもいます。

つらいことばかりだと続かないですからね。

アプリの作成

プロジェクトがひとつのシステムというイメージになります。

アプリがその中での機能ごとに作っていきますが、本格的なプロジェクトだと分け方も異なります。

今回は、タスクを管理するアプリを作成していこうと思います。

まずは、さきほど立ち上げたサーバーを『Ctrl + C』でとめてください。

アプリを作成します。

python manage.py startapp task

そうすると、プロジェクトフォルダの中に、『task』というフォルダが作成されていて、そのなかに複数のフォルダが作成されていることがわかります。

settings.py を編集する

settings.pyというファイルをそのファイル名のとおり、各設定をするファイルになります。

アプリを作ったら、このアプリも管理対象だからね!って、プロジェクトに設定してあげる必要があります。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'task',#追記
]

これで、taskというアプリがあることをプロジェクトが認識できるようになります。

あと、settings.pyの下の方にある言語コードと、タイムゾーンを日本に変更します。

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

スーパーユーザーを作成する

スーパーユーザーって要するに、管理者のことになります。すべての権限をもったユーザーですね。神様って呼んでます(わたしだけ?)

スーパーユーザーを作成する時には、まずはマイグレーションをする必要があります。初期設定で、settings.pyにある

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'task',#追記
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

これらの情報は、まだ実行されていないようなイメージです。実行してないから、器もない。だからスーパーユーザーを作ろうと思っても、器がないからどこに入れたらいいかわからない…

って感じです。

スーパーユーザーをつくれと実際実行すると

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
Traceback (most recent call last):
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\backends\sqlite3\base.py", line 413, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: auth_user

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\hdj16\Desktop\Test\manage.py", line 22, in <module>
    main()
  File "C:\Users\hdj16\Desktop\Test\manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\management\__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\management\base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 79, in execute
    return super().execute(*args, **options)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\management\base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 100, in handle
    default_username = get_default_username()
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\contrib\auth\management\__init__.py", line 140, in get_default_username
    auth_app.User._default_manager.get(username=default_username)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\query.py", line 425, in get
    num = len(clone)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\query.py", line 269, in __len__
    self._fetch_all()
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\query.py", line 1308, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\query.py", line 53, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\sql\compiler.py", line 1156, in execute_sql
    cursor.execute(sql, params)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\backends\utils.py", line 98, in execute
    return super().execute(sql, params)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\backends\utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\backends\utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Users\hdj16\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\backends\sqlite3\base.py", line 413, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such table: auth_user

こんな感じで、エラーとなります。

器づくりのために、マイグレーションをしましょう!

マイグレーションディレクトリを作成する

データベースに反映する手順として、まずはマイグレーションディレクトリを作成します。最初は、テーブル全体の設定ファイルが作成され、次からは差分のファイルが作成されるようになります。

マイグレーションディレクトリを作成するコマンドです。

python manage.py makemigrations

この段階では、追加したアプリの『task』のテーブルを管理するmodels.pyファイルに何も変更をしていないので、何も変更がないよってでます。ユーザーを管理するマイグレーションディレクトリは、自動で管理されているのでいきなり、マイグレートすることになります。

基本的に、マイグレーションディレクトリを作成してマイグレートするという流れになります。

マイグレートをしてデータベースを作成する

それでは、ついにデータベースに反映させたいと思います。

PS C:\Users\hdj16\Desktop\Test> python manage.py migrate       
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

これで、データベースへの反映が出来ました😃

adminやauthについての反映が多いですね

それでは、先ほどはできなかったスーパーユーザーを作成してみましょう❕

python manage.py createsuperuser   #スーパーユーザーを作れの命令
Username (leave blank to use 'hdj16'):   #ユーザーネームをなににするか聞いてきます

無事に動きましたねー❕それでは、ユーザーネームをいれてください

python manage.py createsuperuser
Username (leave blank to use 'hdj16'): goro
Email address: 

Email address は入れても入れなくても通ります。

python manage.py createsuperuser
Username (leave blank to use 'hdj16'): goro
Email address: 
Password: 

パスワードは、スーパーユーザーのみなんでもいけますが、本来は、8桁以上で推測されにくい大文字小文字数字記号を3種類以上使ったものにしなければならないってのが、Djangoの標準です。

こういったことを、自分で設定しなくてもいいのが、Djangoのセキュリティ部分のいいところですねー😉

パスワードを2回入力します。

python manage.py createsuperuser
Username (leave blank to use 'hdj16'): goro
Email address: 
Password: 
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y

そうすると、作っていい?って聞いてくるので、Yesのyを入力してエンターを押下してください。

python manage.py createsuperuser
Username (leave blank to use 'hdj16'): goro
Email address: 
Password: 
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

やりましたね!これでスーパーユーザーが作成できました😃

スーパーユーザーでDjango管理画面を確認してみる!

スーパーユーザーを作ったので、Djangoの魅力である標準で管理画面が作られる機能があるので、実際ログインしてみましょう❕

まずは、サーバーを起動させます。

python manage.py runserver

サーバーが起動するのでWebブラウザで開いてみます。

先ほどとおなじ、ロケットが飛んでいますね。

Djnago日本語化

Setting.pyファイルの言語を日本語にしたので言葉が日本語になっていることが、先ほどと違うところですね

urlの部分をクリックして、最後に『 /admin 』を追加します。

http://127.0.0.1:8000/admin

そうすると、管理画面に入るためのログイン画面が表示されます。

先ほど、作成したスーパーユーザーのUsernameとPasswordを入力して、ログインしてみましょう❕

そうすると、管理サイトに入れましたね😄

ユーザーをクリックすると、現在登録されているユーザーが表示されます。

Djnagoの良さはこの管理サイトが自動で作成されることですね❕右上の『ユーザーを追加』をクリックするとユーザーを簡単に作成することもできますし、ユーザー名をクリックすると修正することも可能です。

今回は、これで終了します!次回は、taskを管理するためのテーブルを作ったりします😃

-Django

© 2021 ごろう@縁紡ぐ