速習Django

これは[呉高専エンジニア勉強会 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/kure-kosen)の7日目の記事です。

こんにちは、呉高専の専攻科のちゃんゆーです。
普段PythonのDjangoでWebアプリ作って遊んでます。
先日(2017/12/02)、[Django2.0がリリース](https://www.djangoproject.com/weblog/2017/dec/02/django-20-released/)されましたが、まだ触りきれていないので、Django1.11のセットアップコマンドからモデルの書き方についてまとめます。

# 環境構築
## Djangoのインストール

```
$ python -V
Python 3.6.2

$ pip install django
$ python -m django --version
1.11.1 # いま(2017/12/06)だと2.0になる？
```

## プロジェクトの作成

```
# プロジェクト名sampleprojectでプロジェクトを作成
$ django-admin startproject sampleproject
```

## アプリの作成

```
# libraryアプリケーションの作成
$ python manage.py startapp library
```

## 開発用サーバーの起動
```
# 8000ポートで起動
$ python manage.py runserver

# 8080ポートを指定して起動
$ python manage.py runserver 0:8080
```

# Model
## Modelの作成
createdとupdatedがミソ。
リレーションは `ForeignKey` で指定する。

```python:library/models.py
from django.db import models
from datetime import datetime


class Owner(models.Model):
    name = models.CharField(max_length=200)
    bio = models.CharField(max_length=200)
    created = models.DateTimeField(default=datetime.now, editable=False)
    updated = models.DateTimeField(auto_now=True)

class Book(models.Model):
    title = models.CharField(max_length=200)
    owner = models.ForeignKey(Owner, on_delete=models.CASCADE)
    created = models.DateTimeField(default=datetime.now, editable=False)
    updated = models.DateTimeField(auto_now=True)

```

## Modelの適用

### アプリをプロジェクトに追加

```python:sampleproject/settings.py
...

INSTALLED_APPS = [
    'library.apps.LibraryConfig', # 追加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

...
```

### マイグレーションファイルの生成

```
$ python manage.py makemigrations library
```

### テーブルの生成

```
$ python manage.py migrate
```

デフォルトの設定だとsampleproject直下に `db.sqlite3` が生成されている。

# View
## Viewの作成

```python:library/views.py
from django.shortcuts import render
from .models import Book, Owner


def index(request):
    book_query = Book.objects.all()
    context = {'books': book_query}
    return render(request, 'library/index.html', context)
```

## Routingの設定
`library/urls.py` を生成する

```python:library/urls.py
from django.conf.urls import url

from . import views

app_name = 'library'
urlpatterns = [
    url(r'^$', views.index, name='index'),
]
```
上記はアプリ内のRoutingの設定なので、プロジェクトに紐付ける。

```python:sampleproject/urls.py

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^library/', include('library.urls')),
    url(r'^admin/', admin.site.urls),
]

```

# Template
## Templateの作成
ディレクトリとファイルがなければ作成する。

```py3:library/templates/library/index.html
{% if books %}
    <ul>
    {% for book in books %}
        <li><p>{{ book.title }}</p></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No book are available.</p>
{% endif %}
```

これで開発用サーバーを立ち上げて `localhost:8000/library/` にアクセスしたら `No book are available.` と表示されるはず。

# Admin
## スーパーユーザの作成
好きなように設定する。

```
$ python manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password: **********
Password (again): *********
Superuser created successfully.
```

## アプリをAdminページに適用

```python:library/admin.py
from django.contrib import admin

from .models import Book, Owner

admin.site.register(Book)
admin.site.register(Owner)
```

## Adminページにログイン
開発用サーバーを立ち上げて、 `localhost:8000/admin` にアクセス。先ほど設定したユーザー名とパスワードを入力したらAdminページに入れる。
そこでDB操作できるので自由にやってみる。

Bookにデータを追加した後、 `localhost:8000/library/`にアクセスしたらBookのtitleが表示されているはず。

# まとめ

以上でDjangoを使ったMVTの一通りの操作になる。
ほんの触りの部分だけなので、これを取っ掛かりに、 [Djangoチュートリアル](https://docs.djangoproject.com/ja/1.11/intro/)でDjangoを学んでみてほしい。

おしまい。