Django-Reactでブログ作成part2:モデルの作成と管理者画面

#目次
1. [Django-Reactでブログ作成part1:docker-composeでプロジェクトを立ち上げ](https://qiita.com/Kobayashi2019/items/66c03b29d8f5effd2341)
2. [Django-Reactでブログ作成part2:モデルの作成と管理者画面](https://qiita.com/Kobayashi2019/items/6fe9d2d8e7486d77ba49) <-- 今ここ

#初めに
この記事は連載記事です。

##今回やること
Django REST frameworkを使いながらビュー、ルート、モデル作成などを行う。

#アプリケーションの作成
新しくアプリを作ります。
プロジェクトとは違うもので、こちらは機能ごとにもっと細かく分けます。
プロジェクトは1つしか作らないのに対してアプリは複数作れます。
今回は1個しかつくらないかも？

```terminal
docker-compose run backend python manage.py startapp blog
```

これでblogというアプリが作れました。

![tree1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/7a7458db-04b4-bc7d-c712-7f6d61619584.png)

アプリを作ったときは必ず`setting.py`の`INSTALLED_APPS`にアプリ名を追加します。

```py:mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog',#追加
]
```

#モデルの作成
これを作ることでデータベースを簡単に操作できるようになります。
##models.py
今回作るモデルはPostモデルとCommentモデルです。
以下をコピペしましょう。

```py:blog/models.py
from django.db import models
from django.utils import timezone


class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

class CommentModel(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    target_post = models.ForeignKey(Post, on_delete=models.SET_NULL, null=True)
    comment = models.TextField(blank=True, null=True)
    published_date = models.DateTimeField(auto_now_add=True)
```
##マイグレーション
モデルを変更したときもマイグレーションが必要です。

```terminal
docker-compose run backend python manage.py makemigrations blog
```

```terminal
docker-compose run backend python manage.py migrate blog
```

#管理者画面の作成
##admin.py

blog/adminを次のように変更します。

```py:blog/admin.py
from django.contrib import admin
from .models import Post, Comment

admin.site.register(Post)
admin.site.register(Comment)
```
ついさっき作ったPostを管理者画面と紐づけました。

##createsuperuser
管理者画面を使うには管理者のアカウントが必要です。

これはコマンドで作れます。

```terminal
docker-compose run backend python manage.py createsuperuser
```
コマンドを打ち込み、username, email, passwordを入力します。
今回はこのようにしました。
実際はパスワードは表示されません。

```terminal
Starting electronicjournal_db_1 ... done
ユーザー名 (leave blank to use 'root'): admin
メールアドレス: admin@email.com
Password: adminpass
Password (again): adminpass
このパスワードは ユーザー名 と似すぎています。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
```

パスワードが簡単すぎて怒られましたが気にしない。

##管理者画面
サーバを立ち上げ、

```terminal
docker-compose up
```


http://127.0.0.1:8000/admin/ にアクセスします。
先ほど設定したusernameとpasswordを入力。

![admin2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/22fb536d-158f-4b05-bf91-6ab4223c6058.png)

ログインすると次のような画面になります。

![admin3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397212/92b6c856-fa84-39fd-71c8-e31cfd2fa9a3.png)


ここでPostやCommentを投稿したり、ユーザーを作ったりできます。
しかしすぐにもう少し使いやすい画面を作るのでここで弄らなくても大丈夫。
`/admin`にアクセスすれば簡単にいろいろ弄れることは覚えておきましょう。

#次回
Django REST frameworkでAPIを作ります。