Djangoでタスク管理アプリをつくりたい！ 環境構築編

# はじめに
　タスク管理用のアプリは多数存在するが，欲しい機能を全て兼ね備えたものがなかなか見つからない。あったとしても，有料版などで手軽に手が出せない。なので，自分で作ってみようとなった。
　今回はPythonのフレームワークであるDjangoを使ってみる

# 導入したい機能
1. ログイン
2. アカウント登録
3. タスク管理
4. ガントチャート生成
5. イナズマ線表示
6. イナズマ線比較
7. チャット
8. アンケート

# 開発環境
・Windows10 professional 64bit
・Python 3.7.1
・Django 2.1.2
・MySQL 8.0.12

# 環境構築
## プロジェクトの作成
プロジェクトを作成したいディレクトリで以下のコマンドを叩く
[taskMan]はプロジェクト名

```powershell:PowerShell
> django-admin startproject taskMan
```
以下のプロジェクトが生成される

```:tree
taskMan
 |---taskMan
 | |---__init__.py
 | |---setting.py
 | |---urls.py
 | |---wsgi.py
 |
 |---manage.py
```

## MySQLの設定
 DjangoではデフォルトでSQLiteを使用しているのでMySQLを使用するように設定(setting.py)を変更する

```python:setting.py
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DB名',
        'USER': 'user名',
        'PASSWORD': 'パスワード',
        'HOST': 'ホスト名',
        'PORT': 'ポート番号',
    }
}
```

次にPythonでMySQLが使用できるようにモジュールをインストールする

```powershell:PowerShell
> python -m pip install PyMySQL
```

プロジェクト内でMySQLを使用することを宣言するために，manage.pyに追記する

```python:manage.py
import pymysql
pymysql.install_as_MySQLdb()
```
MySQLの設定は完了

setting.pyをいっじたので，同時に表示言語を日本語にしてタイムゾーンも東京にする

```python:setting.py
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'ja'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Tokyo'
```

## カスタムユーザモデルの作成
ログイン認証などで使うユーザモデルは拡張性を考え，カスタムユーザモデルを使用したほうが良いとのことなので，デフォルトと同じカスタムユーザモデルを作成し使用する。
[公式ドキュメント](https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#substituting-a-custom-user-model)

・アプリケーションを作成する
manage.pyと同じディレクトリで以下のコマンドを叩く
[accounts]はアプリケーション名

```powershell:PowerShell
> python manage.py startapp accounts
```
アプリケーションが生成され，以下の構成になる

```:tree
taskMan
 |---accounts
 | |---migrations
 | | |---__init__.py
 | |
 | |---__init__.py
 | |---admin.py
 | |---apps.py
 | |---models.py
 | |---tests.py
 | |---views.py
 |
 |---taskMan
 |---manage.py
```

作ったアプリケーションをDjangoに認識してもらうために，setting.pyを編集する

```python:setting.py
# Application definition

INSTALLED_APPS = [
    'accounts',  #追加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
```

・カスタムユーザモデルを作成する

```python:models.py
from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass
```
`AbstractUser`を継承すると，デフォルトのUserに要素を追加できる
しかし今回は，デフォルトと同じものを作るので`pass`とする

```python:admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

admin.site.register(User, UserAdmin)
```
カスタムユーザモデルをadminに追加する

このままではカスタムユーザが認証には使われないので，認証用にするためにsetting.pyに追加する

```python:setting.py
AUTH_USER_MODEL = 'accounts.User'
```

## サイト管理画面へログイン
作成したカスタムユーザモデルできちんとログインが認証されるか，確認するためにサイト管理画面へログインする

その前に，ログインするためにユーザを作成する
・manage.pyのあるディレクトリでコマンドを叩く

```powershell:PowerShell
> python manage.py makemigrations
Migrations for 'accounts':
  accounts\migrations\0001_initial.py
    - Create model User

> python manage.py migrate
Apply all migrations: accounts, admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... 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 accounts.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 sessions.0001_initial... OK
```
DBにテーブルが作成された

次にsuperuserを作成する
（superuserはどのサイトも見ることができるユーザ）

```powershell:PowerShell
> python manage.py createsuperuser
ユーザー名: admin
メールアドレス: admin@test.com
Password:
Password (again):
Superuser created successfully.
```
`Superuser created successfully.`と表示されれば成功
パスワードは見えないが，それが正常なので問題ない
また，パスワードが単純だった入りすると警告が出る

・ローカルサーバを起動する

```powershell:PowerShell
> python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
November 06, 2018 - 12:55:05
Django version 2.1.2, using settings 'taskMan.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
```

[http://localhost:8000](http://127.0.0.1:8000)にアクセスして
![image.png](https://qiita-image-store.s3.amazonaws.com/0/300075/49f9533f-2dc6-cba0-a4bc-76171a6eaf49.png)

この画面が表示されたら無事起動

そこから[http://localhost:8000/admin](http://127.0.0.1:8000/admin)にアクセスし
![image.png](https://qiita-image-store.s3.amazonaws.com/0/300075/5b8ef633-9ef1-811b-2cbb-487e5aef4357.png)
先ほど登録したユーザ名とパスワードを使いログインする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/300075/6cdf8159-eeb5-79c6-3e88-d1e2bf3b381b.png)
この画面が表示されたならログイン成功
作成したユーザモデルが認証に使えることを確認できた。

# 今回のまとめ
Djangoは初めて使ってみたが，MVCモデルを意識したフレームワークだったのでわかりやすく，構成に悩むことは少なかった。しかし，Pythonの知識や個々のモジュールについては理解しきれていないところがあり，syntax errorが多々あったのでやりながら覚えていきたい。

今後は導入したい機能を一つずつ作りながら，アプリの完成を目指していく


# シリーズ
・Djangoでタスク管理アプリをつくりたい! 環境構築編
・[Djangoでタスク管理アプリをつくりたい! ユーザ認証編](https://qiita.com/kuma3_it/items/8038fac36c41b139e285)
・[Djangoでタスク管理アプリをつくりたい! ユーザ情報編](https://qiita.com/kuma3_it/items/32edb3854c5154ca6ba6)
・[Djangoでタスク管理アプリをつくりたい！ プロジェクト管理編](https://qiita.com/kuma3_it/items/bbca1565a62aac0d0a63)
・[Djangoでタスク管理アプリをつくりたい！ タスク管理編１](https://qiita.com/kuma3_it/items/7cb0f838fa4f99a74441)