はじめてDjango(2.1.1)に入門してみた@その1

# はじめに
- Python初心者がDjangoに入門してみた記録です

# 実行環境
- Windows10
- Python3.7
- Django2.1.1

# チュートリアル
以下のQiitaを見ながら、実際に手を動かしてやってみました
すごく丁寧な解説で、ありがたいです。感謝

- [Python Django入門 (3)](https://qiita.com/kaki_k/items/7b178ad39394a031b50d)

## 仮想環境を作る

```txt:仮想環境を作る
C:\Apache24\htdocs>cd lesson-django
C:\Apache24\htdocs\lesson-django>python -m venv env1
C:\Apache24\htdocs\lesson-django>cd env1

(env1) C:\Apache24\htdocs\lesson-django\env1>
(env1) C:\Apache24\htdocs\lesson-django\env1>pip -V
pip 10.0.1 from c:\apache24\htdocs\lesson-django\env1\lib\site-packages\pip (python 3.7)

(env1) C:\Apache24\htdocs\lesson-django\env1>python -V
Python 3.7.0

(env1) C:\Apache24\htdocs\lesson-django\env1>python -m pip install -U pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/5f/25/e52d3f31441505a5f3af41213346e5b6c221c9e086a166f3703d2ddaf940/pip-18.0-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 10.0.1
    Uninstalling pip-10.0.1:
      Successfully uninstalled pip-10.0.1
Successfully installed pip-18.0
```

## Djangoをインストールする

```txt:djangoをインストールする
(env1) C:\Apache24\htdocs\lesson-django\env1>pip install django
Collecting django
  Downloading https://files.pythonhosted.org/packages/ca/7e/fc068d164b32552ae3a8f8d5d0280c083f2e8d553e71ecacc21927564561/Django-2.1.1-py3-none-any.whl (7.3MB)
    100% |████████████████████████████████| 7.3MB 555kB/s
Collecting pytz (from django)
  Using cached https://files.pythonhosted.org/packages/30/4e/27c34b62430286c6d59177a0842ed90dc789ce5d1ed740887653b898779a/pytz-2018.5-py2.py3-none-any.whl
Installing collected packages: pytz, django
Successfully installed django-2.1.1 pytz-2018.5
```

## プロジェクトを作成する

```txt:プロジェクトを作成する
(env1) C:\Apache24\htdocs\lesson-django\env1>django-admin.py startproject mybook

(env1) C:\Apache24\htdocs\lesson-django\env1>dir
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 6027-7EAB です

 C:\Apache24\htdocs\lesson-django\env1 のディレクトリ

2018/09/21  23:00    <DIR>          .
2018/09/21  23:00    <DIR>          ..
2018/09/21  22:54    <DIR>          Include
2018/09/21  22:54    <DIR>          Lib
2018/09/21  23:01    <DIR>          mybook
2018/09/21  22:56                59 pip-selfcheck.json
2018/09/21  22:54                87 pyvenv.cfg
2018/09/21  22:57    <DIR>          Scripts
               2 個のファイル                 146 バイト
               6 個のディレクトリ  36,320,899,072 バイトの空き領域

(env1) C:\Apache24\htdocs\lesson-django\env1>cd mybook

(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>dir
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 6027-7EAB です

 C:\Apache24\htdocs\lesson-django\env1\mybook のディレクトリ

2018/09/21  23:01    <DIR>          .
2018/09/21  23:01    <DIR>          ..
2018/09/21  23:01               553 manage.py
2018/09/21  23:01    <DIR>          mybook
               1 個のファイル                 553 バイト
               3 個のディレクトリ  36,320,899,072 バイトの空き領域

(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>dir mybook
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 6027-7EAB です

 C:\Apache24\htdocs\lesson-django\env1\mybook\mybook のディレクトリ

2018/09/21  23:01    <DIR>          .
2018/09/21  23:01    <DIR>          ..
2018/09/21  23:01             3,208 settings.py
2018/09/21  23:01               769 urls.py
2018/09/21  23:01               405 wsgi.py
2018/09/21  23:01                 0 __init__.py
               4 個のファイル               4,382 バイト
               2 個のディレクトリ  36,320,768,000 バイトの空き領域
```

## マイグレーション

```txt:maigration
(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>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 sessions.0001_initial... OK
```

## スーパーユーザの作成

```txt:スーパーユーザの作成
(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>python manage.py createsuperuser
ユーザー名 (leave blank to use 'sireline'): admin
メールアドレス: admin@example.com
Password:hogehoge
Password (again):hogehoge
このパスワードは一般的すぎます。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
```

## 開発用サーバの起動

```txt:開発用サーバの起動
(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
September 21, 2018 - 23:32:51
Django version 2.1.1, using settings 'mybook.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
```

```sh:AWS_EC2に外部からアクセスする場合
python manage.py runserver 0.0.0.0:8000
```

## Webブラウザでアクセス

- [http://127.0.0.1:8000/](http://127.0.0.1:8000/)

以下の画面が表示されればOKです。
![django-fig1.png](https://qiita-image-store.s3.amazonaws.com/0/89366/fe0794a2-6fa3-a1eb-11d5-28939c9922f9.png)

## 開発用サーバの停止

```txt:開発用サーバの停止
Ctrl+c
```

## アプリケーションの作成

```txt:アプリケーションの作成
(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>python manage.py startapp cms

(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>dir
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 6027-7EAB です

 C:\Apache24\htdocs\lesson-django\env1\mybook のディレクトリ

2018/09/21  23:48    <DIR>          .
2018/09/21  23:48    <DIR>          ..
2018/09/21  23:48    <DIR>          cms
2018/09/21  23:27           131,072 db.sqlite3
2018/09/21  23:01               553 manage.py
2018/09/21  23:09    <DIR>          mybook
               2 個のファイル             131,625 バイト
               4 個のディレクトリ  36,300,689,408 バイトの空き領域

(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>dir cms
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は 6027-7EAB です

 C:\Apache24\htdocs\lesson-django\env1\mybook\cms のディレクトリ

2018/09/21  23:48    <DIR>          .
2018/09/21  23:48    <DIR>          ..
2018/09/21  23:48                66 admin.py
2018/09/21  23:48                86 apps.py
2018/09/21  23:48    <DIR>          migrations
2018/09/21  23:48                60 models.py
2018/09/21  23:48                63 tests.py
2018/09/21  23:48                66 views.py
2018/09/21  23:48                 0 __init__.py
               6 個のファイル                 341 バイト
               3 個のディレクトリ  36,300,623,872 バイトの空き領域
```

## モデルの定義

```py:cms/models.py
from django.db import models

# Create your models here.
class Book(models.Model):
    """書籍"""
    name = models.CharField('書籍名', max_length=255)
    publisher = models.CharField('出版社', max_length=255, blank=True)
    page = models.IntegerField('ページ数', blank=True, default=0)

    def __str__(self):
        return self.name


class Impression(models.Model):
    """感想"""
    book = models.ForeignKey(Book, verbose_name='書籍', related_name='impressions', on_delete=models.CASCADE)
    comment = models.TextField('コメント', blank=True)

    def __str__(self):
        return self.comment

```

## モデルの有効化

```py:mybook/settings.py
# Application definition

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

## マイグレートファイルの作成

```txt:マイグレートファイルの作成
(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>python manage.py makemigrations cms
Migrations for 'cms':
  cms\migrations\0001_initial.py
    - Create model Book
    - Create model Impression
```

## SQLコマンドの確認

```txt:SQLコマンドの確認
(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>python manage.py sqlmigrate cms 0001
BEGIN;
--
-- Create model Book
--
CREATE TABLE "cms_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(255) NOT NULL, "publisher" varchar(255) NOT NULL, "page" integer NOT NULL);
--
-- Create model Impression
--
CREATE TABLE "cms_impression" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "comment" text NOT NULL, "book_id" integer NOT NULL REFERENCES "cms_book" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "cms_impression_book_id_b2966102" ON "cms_impression" ("book_id");
COMMIT;
```

## データベースへ反映

```txt:データベースへ反映
(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>python manage.py migrate cms
Operations to perform:
  Apply all migrations: cms
Running migrations:
  Applying cms.0001_initial... OK
```

## 管理サイトへログイン

### サーバ起動

```txt:サーバ起動
(env1) C:\Apache24\htdocs\lesson-django\env1\mybook>python manage.py runserver
```

### Webブラウザで管理サイトへアクセス

- [http://127.0.0.1:8000/admin/](http://127.0.0.1:8000/admin/)

### ログイン

![django-fig2.png](https://qiita-image-store.s3.amazonaws.com/0/89366/dbd6293f-6402-ef76-abf8-34d6cb6f4764.png)

```txt:
ユーザ名：admin
パスワード：hogehoge
```

## 管理サイトの表示

![django-fig3.png](https://qiita-image-store.s3.amazonaws.com/0/89366/643e4a91-cf04-7a7e-4a93-7643086db191.png)

## 管理サイトへモデルを登録

```py:cms/admin.py
from django.contrib import admin
from cms.models import Book, Impression

# Register your models here.
admin.site.register(Book)
admin.site.register(Impression)
```

## リロード
管理サイトで編集出来るようになる

- CMS
 - Books
 - Impressions


![django-fig4.png](https://qiita-image-store.s3.amazonaws.com/0/89366/3e7e0a95-f76b-a59d-74af-325f7e480933.png)

## Book追加画面

Booksの+追加をクリックする

![django-fig5.png](https://qiita-image-store.s3.amazonaws.com/0/89366/1130f528-fedf-b486-9b5c-50775cade4ee.png)

```txt:
書籍名：ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装
出版社：オライリー・ジャパン
ページ数：320
```

保存ボタンをクリックすると、bookが追加される

## Books一覧画面

![django-fig6.png](https://qiita-image-store.s3.amazonaws.com/0/89366/ba136f19-81f4-1b74-559c-3cab8531da7c.png)

## Book編集画面

![django-fig7.png](https://qiita-image-store.s3.amazonaws.com/0/89366/63ffbdc3-7c44-7ac8-148a-4b731658438e.png)

## 一覧画面のカスタマイズ

```py:cms/admin.py
from django.contrib import admin
from cms.models import Book, Impression

# Register your models here.
#admin.site.register(Book)
#admin.site.register(Impression)

class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'publisher', 'page',)
    list_display_links = ('id', 'name',)

admin.site.register(Book, BookAdmin)


class ImpressionAdmin(admin.ModelAdmin):
    list_display = ('id', 'comment',)
    list_display_links = ('id', 'comment',)
    raw_id_fields = ('book',)

admin.site.register(Impression, ImpressionAdmin)

```

## カスタマイズ後のBook一覧画面

![django-fig8.png](https://qiita-image-store.s3.amazonaws.com/0/89366/55fc8d81-8d20-7ce8-a8e7-9ea3de5d9c38.png)

# おわりに＆今後について

- CRUD操作が簡単に出来て、すごく便利！
- [公式サイト](https://docs.djangoproject.com/ja/2.1/)を見て、Djangoの全体像を把握する
- 最終的にはDBを、MySQLにしたい