Django2.0でブログの作成（その１）

djangogirlsをさらに簡略化してまとめ、ちょっと要素を付加したものです。

# 目次
* [Django2.0でブログの作成（その１）](https://qiita.com/ume1126/items/323e6dbbb886acb3d575)
* [Django2.0でブログの作成（その２：タイトルと本文の表示）](https://qiita.com/ume1126/items/d3ba07ef1b73838d065a)
* [Django2.0でブログの作成（その３：記事表示ページ）](https://qiita.com/ume1126/items/ff8d597cd2f9ecbbd129)
* [Django2.0でブログの作成（その４：記事へのコメント）](https://qiita.com/ume1126/items/8b0e896240666cae0e3c)
* [Django2.0でブログの作成（その５：コメントを削除）](https://qiita.com/ume1126/items/856886ba01b6f936d437)
* [Django2.0でブログの作成（その６：記事の作成）](https://qiita.com/ume1126/items/fe805b8ff1cd9f371e79)
* [Django2.0でブログの作成（その７：記事の編集）](https://qiita.com/ume1126/items/639bdd0484fc871dc2cf)
* [Django2.0でブログの作成（その８：記事の削除）](https://qiita.com/ume1126/items/3295dc1f1be3ae527810)
* [Django2.0でブログの作成（その９：記事の検索）](https://qiita.com/ume1126/items/9c6dab71e6e6c128a243)
* [Django2.0でブログの作成（その１０：ユーザーログインページ）](https://qiita.com/ume1126/items/bf6342a49a91f6eaf88a)


# 仮想環境
- virtualenv使用
- django2.0を入れる


# 準備
- プロジェクトの作成
- アプリの作成
- 基礎となるsetting.pyの編集

まずは、`mkdir hogeproject`
任意の名前でファイルを作って、その中に移動する
`cd hogeprogect`


### 1.プロジェクト(mysite)の作成
`django-admin startproject mysite .`
ピリオドがないと、mysiteの中にmysiteが作られてしまう。
その場合はmkdirhogeprojectをせずにやればよい。
mysiteは任意の名前で良い。

### 2.アプリ(blog)の作成
`python manage.py startapp blog`
blogは任意の名前で良い。

### 3.setting.pyの編集
※該当箇所のみ変更すること

```python:mysite/setting.py
(略)
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']
(略)
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog' #アプリ名を追加
]
(略)
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
(略)
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static') #画像などに使用するstaticfileの追加
```

# DB作成
- models.py or forms.py 作成
- makemigrations
- migrate
この順番は鉄則！

### 1.models.py 作成
```blog/modesl.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)
    live = models.BooleanField(default=False)

    class Meta:
        ordering = ['-created_date']

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

    def __str__(self):
        return self.title
```
標準で　`__str__(self)` が返る。
今回は何もしなければtitleが返る。

class Meta:はデフォルト設定。
created_dateにマイナスが付いているので、順番が逆になる。
つまり最新のものが上に来る。という設定のこと。

### 2.makemigrations
`python manage.py makemigrations blog`
blogはアプリ名を入れる
これでまずはデータベースを更新するための.pyファイルを作る。

### 3.migrate
`python manage.py migrate`
or
`python manage.py migrate blog`
blogはアプリ名を入れる
先ほど作成された.pyファイルを使用して、データベースを更新する。
※makemigrations→migrateはセットで行う！

# ユーザーを作る
```blog/admin.py
from django.contrib import admin
from .models import Post

admin.site.register(Post)
```
これを作ってから、ターミナルでスーパーユーザーをつくる。
`python manage.py createsuperuser`

* usename
* e-mail
* password(半角英数混在8文字以上)
* password(確認)

これでスーパーユーザーが作れるので
localhost:8000/adminにアクセスしてログインしてみる。
できたらいくつかPostを追加しておこう。



# ページを作る
とりあえず何事も以下の通り行う。
その2〜必ず全て(例外もありますが)views→urls→htmlとやっていきます。
正確には、順番は関係ありません。
この３つの要素全てを変更すればOKです。（たまにmodelsやformsやadminも追加したり変更したりする）
今回はわかりやすいように、全てviews→urls→htmlの順番で行います。

- ①views.py
- ②urls.py
- ③html作成

### 1.views.py
```blog/views.py
from django.shortcuts import render

def post_list(request):
    return render(request, 'blog/post_list.html', {})
```

### 2.urls.py
初回は必ず親のurls.pyをかえる！

```mysite/urls.py
from django.contrib import admin
from django.urls import path, include #include追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')), #この行追加
]
```
これで、子/urls.pyをincludeしている。
毎回子のurl.pyは変える！(最初は自動で作られたりしないから、手動で作る）

```blog/urls.py
from django.urls import path
from . import views

app_name = 'blog' #django2.0から必要になったnamespace定義
urlpatterns = [
    path('', views.post_list, name='post_list'),
]
```

### 3.html作成
templates/blog/post_list.html
を作る

```post_list.html
<html>
    <head>
        <title>Ola's blog</title>
    </head>
    <body>
        <p>Hi there!</p>
        <p>It works!</p>
    </body>
</html>
```