Django Sprint #2 新規プロジェクトのスタート

- [Django Sprint #0 イントロダクション](https://qiita.com/tmgauss/private/a0dbc8b90fd5c95732af)
- [Django Sprint #1 環境構築](https://qiita.com/tmgauss/private/7e07b572dc6913475f86)
- [Django Sprint #2 新規プロジェクトのスタート](https://qiita.com/tmgauss/private/96c74381b52da4679d19)
- [Django Sprint #3 ユーザーモデルのカスタマイズ](https://qiita.com/tmgauss/private/b8edaf0da8cb8c22b1b5)
- [Django Sprint #4 トップページの作成](https://qiita.com/tmgauss/private/889793b2d7c6c89d6863)
- [Django Sprint #5 汎用ビューとCRUD 前編](https://qiita.com/tmgauss/private/0664cb98ca95e9737091)
- [Django Sprint #6 汎用ビューとCRUD 後編](https://qiita.com/tmgauss/private/96613b26dc0eea28d3c6)


## 目次

1. プロジェクトの作成
2. Gitによるバージョン管理


## プロジェクトの作成

#### 作業用ディレクトリの作成
まず、作業用ディレクトリ（フォルダ）を作ります。適当な場所に各自作成してください。
本チュートリアルではルートディレクトリの下に「code」という名前のディレクトリを作成したとし、そのパスの表記を簡単にするために

```terminal:~/code/
 (base) XXXXnoMacBook-Pro:code XXXX$
```
を単に

```terminal:
$
```

と書くことにします。

この時点で、エディタでこのディレクトリを開いておくことをおすすめします。

**tips** : PyCharm Professional でそのディレクトリを開くと以下のようになります。
<img width="1280" alt="スクリーンショット 2020-04-28 14.43.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489338/7d4780c4-a57e-3d93-4f7f-ae426977d9e3.png">
ここで、左下の「Terminal」というところをクリックすると、ターミナルが起動し、
<img width="1280" alt="スクリーンショット 2020-04-28 14.47.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489338/d21f5e6f-ba83-715d-b56b-8f2cf1d960e5.png">
このような形になります。




#### Djangoのインストール
さあいよいよ、Djangoをインストールしましょう！インストールは簡単な2ステップです。

1. ```Dockerfile```, ```docker-compose.yml```, ```requirements.txt``` を作成
2. ```docker-compose run```でプロジェクトを開始

まず、各種ファイルを作成します。もし、CUI上で作成するならこのようになります。

```terminal:
$ touch Dockerfile
$ touch docker-compose.yml
$ touch requirements.txt
```

これらをエディタ上で開き、中身を以下のように書き換えます。

```Dockerfile:/Dockerfile
FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
```

```y:/docker-compose.yml
version: '3'

services:
  db:
    image: postgres
    environment:
      - POSTGRES_PASSWORD=somepassword
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
```

```txt:/requirements.txt
Django>=2.1,<2.2
psycopg2>=2.7,<3.0
```
次にターミナルに戻って、現在地が```code```であることを確認してからプロジェクトを開始します。

```terminal
$ pwd
/code
$ sudo docker-compose run web django-admin startproject config .
Password:
Starting code_db_1 ... done
```

これで「config」という名前のプロジェクトを作成しました。（configという名前の由来については追って説明します。他の名前でももちろん構いません。）ディレクトリ構造が以下のようになっているのを確認してください。

```
code
├─ requirements.txt
├─ manage.py
├─ config
│  ├─ __init__.py
│  ├─ settings.py
│  ├─ urls.py
│  └─ wsgi.py
├─ docker-compose.yml
└─ Dockerfile
```

#### データベースの設定
このsettings.pyを開いて、DBに関する記述を探し出してください。

```python:/config/settings.py
...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
...
```
この部分を以下のように書き換えます。

```python:/config/settings.py
...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
        'PASSWORD': 'somepassword',
    }
}
...
```
最後に、コンテナを起動してWebサーバーとDBが繋がっているか確認します。

```terminal
$ docker-compose up
...
web_1  | Starting development server at http://0.0.0.0:8000/
web_1  | Quit the server with CONTROL-C.
```
のように```exit(1)```しなければOKです！（Railsでいうところの```rails server```みたいのものです。）

**注意** : ```docker-compose run --rm web python3 manage.py migrate```を実行しないでください。あとで面倒なことになります。

### コンテナの扱い方
***以下は、今実行するものではありません。一通り読んで、理解してください。***

各種 Django のコマンドはこのように書き換えます。例えば、```django-admin startapp app```なら、

```terminal
$ docker-compose run --rm web django-admin startapp app
```
```python3 manage.py migrate```なら、

```terminal
$ docker-compose run --rm web python3 manage.py migrate
```
となります。```-rm```オプションをつけないとPCに使用済みコンテナが溢れ、容量を圧迫します。

その他のコマンドなどについては以下の記事を参考にしてください。

- [Django Sprint Appendix Docker関連](https://qiita.com/tmgauss/private/bf3545d17c7271ed4fcb)



## Gitによるバージョン管理
おおまかな手順は以下の通りです。

1. ```git init```でローカルレポジトリを作成
1. .gitignoreファイルの作成
1. ```git add``` & ```git commit```
1. GitHub上にリモートレポジトリを作成
1. 1と2を関連づける
1. 現在の内容を```git push```する


#### ローカルリポジトリの設定
まず、```pwd```で所定の作業ディレクトリにいることを確認し、ローカルレポジトリを作成します。

```terminal
$ pwd
/code
$ git init
Initialized empty Git repository in /code/.git/
```
もし、Gitの使用が初めてである場合は

```terminal
$ git config --global user.name "XXXX"
$ git config --global user.email xyz@example.com
```
のように、ユーザー名とメールアドレスを登録します。

次に、```.gitignore```を作成します。```.gitignore```が何かについては、[こちら](https://techacademy.jp/magazine/10179)を参照してください。基本的には、バイナリファイルなどのほかの共同開発者と共有されるべきではないファイルを共有されないようにするためのものです。開発する言語、利用するライブラリ、フレームワークなどによって変わってきますが、このチュートリアル内では(≒Djangoでは)以下の内容を利用します。
**```.gitignore```を作成するタイミングは、リポジトリを作成するタイミングです。**リポジトリ作成時には必ず行ってください。それ以降は必要に応じて追記・削除していくといった運用方法です。
では、/code/直下に.gitignoreというファイルを作成し、以下の内容を書き込んで保存してください。

- [docker-django/blob/master/.gitignore](https://raw.githubusercontent.com/erroneousboat/docker-django/master/.gitignore)

後のローカルでの作業はaddしてcommitするだけです。

```terminal
$ git add -A
$ git commit -m "Initialize repository"
[master (root-commit) f96ebdd] Initialize repository
 13 files changed, 241 insertions(+)
 create mode 100644 .idea/.gitignore
...
```
このようなGitコマンドについて分からなかった人は今一度[『サル先生のGit入門』](https://backlog.com/ja/git-tutorial/)を参照してください。


#### リモートレポジトリの設定
次に、GitHubのWebページに戻り、メニューバー右上の「+」ボタンをクリックすると「New repository」とあるのでそれをクリックします。すると、次のようなページに遷移します。

<img width="1280" alt="スクリーンショット 2020-04-29 9.13.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489338/376be060-a85f-6543-8a44-2e092fbd6a39.png">

- Repository name: レポジトリの名前です。プロジェクトの名前にしておけば大丈夫です。ここでは「django_sprint」としておきます。
- Description: レポジトリの説明を加えることができます。
- Public / Private: このプロジェクトのレポジトリを公開するか否かを選択できます。（ここは十分にチームで話し合って決めてください。）
- Initialize this repository with a README: チェックを外す
- Add .gitignore: None
- Add a license: None

ここまできたら「Create repository」をクリックしましょう！


#### ローカルとリモートを紐付ける
あとはローカルとリモートを結び付けて、pushするだけです。各自XXXXのところをGitHubのユーザー名に変更してください。

```terminal
$ git remote add origin https://github.com/XXXX/django_sprint.git
$ git push -u origin master
...
To https://github.com/XXXX/django_sprint.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
```
もう一度GitHubのページに戻り、上手くいったことを確認してください。
<img width="1280" alt="スクリーンショット 2020-04-29 9.27.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489338/281056aa-a907-2ab1-df03-3bb0bac731a1.png">



## 参照

- [Django Sprint #0 イントロダクション](https://qiita.com/tmgauss/private/a0dbc8b90fd5c95732af)
- [Django Sprint #1 環境構築](https://qiita.com/tmgauss/private/7e07b572dc6913475f86)
- [Django Sprint #2 新規プロジェクトのスタート](https://qiita.com/tmgauss/private/96c74381b52da4679d19)
- [Django Sprint #3 ユーザーモデルのカスタマイズ](https://qiita.com/tmgauss/private/b8edaf0da8cb8c22b1b5)
- [Django Sprint #4 トップページの作成](https://qiita.com/tmgauss/private/889793b2d7c6c89d6863)
- [Django Sprint #5 汎用ビューとCRUD 前編](https://qiita.com/tmgauss/private/0664cb98ca95e9737091)
- [Django Sprint #6 汎用ビューとCRUD 後編](https://qiita.com/tmgauss/private/96613b26dc0eea28d3c6)
- [Django Sprint Appendix Docker関連](https://qiita.com/tmgauss/private/bf3545d17c7271ed4fcb)
- [Django Sprint Appendix 各種実装まとめ](https://qiita.com/tmgauss/private/f92044b346825b812121)
- [Django Sprint Appendix モデルとデータベース](https://qiita.com/tmgauss/private/5e882e71100b798209d8)
- [Django+PostgreSQLのアプリケーションをAWSのElastic Beanstalkにデプロイする (UTokyo Project Sprint 用)](https://qiita.com/Chrg/private/d0c6fa829040613d1bb6)
- [Django+MySQLのアプリケーションをAWSのElastic Beanstalkにデプロイする (UTokyo Project Sprint 用)](https://qiita.com/yulingo-ringo/private/5c2be0a31636c33565f1)