Djangoプロジェクト〜アプリ立ち上げの流れ

この記事では、Djangoのプロジェクト、アプリの立ち上げ方を紹介する。つまり、初期設定の説明を行う。
- アプリ開発での応用は、以下の記事を参考にする
    - [Djangoアプリ開発（逆引き）](https://qiita.com/kkk777/items/0a81139704f3b10d072e)

- 処理の流れ
    - プロジェクトを管理するdirを作成
    - 仮想環境を構築
    - 仮想環境にDjangoをinstall
    - プロジェクトを作成
    - アプリ作成
    - settings.pyの設定
    - マイグレーション
    - [gitに登録する](https://qiita.com/kkk777/items/f7f1356cd65593f0eab1)
    - Djangoサーバー起動
    - Django管理サイトにログイン
    - Appendix（付録）
        - RDBMS別のDB接続方法

# プロジェクトを管理するdirを作成
```:ターミナル
$ cd Desktop
$ mkdir dir名
$ cd dir名
$ code .
```
- プロジェクトを管理するdirを作成

# 仮想環境を構築し、Djangoをインストール
```:vscode
$ python3 -m venv 仮想環境名
$ source 仮想環境名/bin/activate
$ pip install django
$ django-admin startproject プロジェクト名
$ cd プロジェクト名
```
- 仮想環境を構築
- 仮想環境内にDjangoをインストール
- プロジェクト立ち上げ

# プロジェクトを作成
```:vscode
python3 manage.py startapp アプリ名
```
- アプリ立ち上げ

# settings.pyの設定
```python:vscode
DEBUG = True # 本番環境（デプロイ環境）ではFalse
ALLOWED_HOSTS = ['*'] # 全てのホストを許可（本番環境では['*']にしてはいけない）
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'アプリ名', # 追加
]
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR/'templates'], # 追加
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
```
- [ALLOWED_HOSTS](https://qiita.com/kkk777/items/b9452738bc5d3bb35542)：接続を受け付けるサーバを指定する環境変数
- INSTALLED_APPS：作成したアプリを登録する環境変数
- TEMPLATES：テンプレートの設定を行う環境変数
    - DIRS：テンプレートの検索対象とするフォルダをリストで指定。APP_DIRSより先に検索される
    - APP_DIRS：各アプリ内のtemplatesディレクトリをテンプレートの検索対象にするかを指定。デフォルトでTrueなので、settings.py内のINSTALLED_APPSに記載あるアプリから順にtemplatesフォルダを探索する
    - BASE_DIR：プロジェクトdir。つまり、manage.pyを格納しているディレクトリ
- 作成するアプリごとに、templatesディレクトリでまとめると整理しやすい
```:dir階層
project_dir
├── env
└── project_dir   <= BASE_DIR
    ├── accounts
    ├── app
    ├── peoject_dir
    ├── templates # 作成
    ├── db.sqlite3
    └── manage.py
```

# マイグレーション
```:vscode
$ python3 manage.py migrate
```
- デフォルトのモデルをsqlite（RDBMS）のDB内のテーブルとして反映

# gitに登録する
```:vscode
# GitHubでリモートリポジトリを作成しておく
$ git init
$ git add . # ローカルリポジトリにステージング
$ git commit -m "コミットメッセージ" # ローカルリポジトリにコミット
$ git status # 開発ブランチの状態を確認
$ git remote add origin リモートリポジトリURL # ローカルリポジトリとリモートリポジトリを紐づける
$ git push origin master # リモートリポジトリにpush
```
- プロジェクトをgitで管理する
- git add .コマンドを用いてステージングする場合、manage.pyを含むdirまで移動してから実行すること
    - 理由：[git add --all と git add .の違い](https://qiita.com/kkk777/items/f7f1356cd65593f0eab1)

# Django開発サーバー起動
```:vscode
$ python3 manage.py runserver
```
- 開発サーバ起動

# Django管理サイトにログイン
```:vscode
$ python3 manage.py createsuperuser
```
- Emailは任意（空白でも可）
- 管理ユーザ名（スーパーユーザ）とそのユーザのパスワードは必須
- トップページのURLの末尾にadmin/をつけてadminサイトにアクセス
- 作成した管理ユーザでログイン

- **Django管理サイトとは**：
    - Djangoで作成したWebアプリケーションのデータを管理するためのサイト
    - つまり、Djangoにデフォルトで組み込まれているアプリの1つ
    - 利用するのは主に管理者（Administrator）や開発者
    - 管理サイトを通して、簡単にモデルに対応したテーブルのレコードを操作（CRUD：追加、削除、変更）することが可能


# Appendix（付録）
- デフォルトのsqliteにデータを保存している場合、全て消えるので注意
    - Userモデル内のデータも消えるので、再度createuerを実行する必要がある
- 最初からRDBMSに接続しておくことを推奨
- python3 manage.py runserverを行う際は、RDBMSのサーバを起動しておく必要がある
## PostgreSQLのDBに接続
- PostgreSQL側
    - PostgreSQLサーバを起動
    - サーバに接続し、superuserであるpostgres（DB初期ユーザ）でDB（appdb）を作成
- Django側
    - PostgreSQLに接続するためのライブラリを仮想環境内にインストール
    - settings.pyのDATABASESをsqlite3からPostgreSQLに修正
    - Django管理サイトのスーパーユーザを作成
    - マイグレーション
```:PostgreSQL
$ pg_ctl start -D ./django_project
$ createdb -U postgres appdb
```
※[DBクラスタを作成済みである前提](https://qiita.com/kkk777/items/a2bc50ec27a9870b0ad4)
$ cd Desktop
$ pg_ctl initdb -D ./django_project
```:vscode
(env) $ pip install psycopg2
```
※インストールできない場合は、(env) $ pip insatall psyconpg2-binaryを実行
```python:settings.py
DATABASES = {
    'default': {
        'ENGINE':'django.db.backends.postgresql_psycopg2', # PostgreSQL使いますよ宣言
        'NAME': 'appdb', # データベース名
        'USER': 'postgres', # データベースに接続するDBユーザー名
        'PASSWORD': 'password1', # データベースに接続する際のDBユーザのパスワード
        'HOST': '', # 'localhost'
        'PORT': '', # 5432
    }
}
```
※作成したDBクラスタ（django_project）内に、postgres（DBユーザ）が作成されていて、postgresユーザにパスワードが設定されている前提
$ psql -U postgres -d postgres
postgres=# ALTER USER postgres WITH PASSWORD 'password1';

- `PASSWORD`：DBユーザのパスワードを指定。DB接続時の認証に使用される。「$ createuser user1 -P」コマンドによって、user1（DBユーザ）にパスワードを設定していない場合は、空白でも可。（おそらく）
- `HOST`：接続するPostgreSQLサーバのIPアドレス、または’localhost’を指定。空白の場合、PostgreSQLの環境変数PGHOSTの値を使用する。PGHOSTを指定していない場合は、localhostに接続する
- `PORT`：接続するPostgreSQLサーバのport番号を指定。空白の場合、PostgreSQLの環境変数PGPORTの値を使用する。PGPORTを指定していない場合は、5432に接続する

```:vscode
$ python3 manage.py createsuperuser
$ python3 manage.py migrate
```
- PostgreSQL側で
    - 作成したデータがappdb内のテーブル（アプリ名_モデル名）に登録されている
    - SELECT * FROM アプリ名_モデル名;を実行するとデータが確認できる


※DjangoのモデルがPostgreSQLのDBのテーブルになる