Djangoの一連の操作

# はじめに
自分用の備忘録です。

# プロジェクト関連の操作
## プロジェクトの作成

```:startproject
python manage.py startproject mysite
```

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

```:startapp
python manage.py startapp games
```

## アプリケーションのインストール
アプリケーションの追加をdjangoに教える必要があります。

```python:mysite/settings.py
(省略)
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'games', #ここに追記
]
(省略)
```

## モデルを定義
アプリケーション内にモデルを追加します。
Railsと違い、import句ぐらいしか自動生成されないので、0から自身で記載する必要があります。

```python:mysite/games/models.py
from django.db import models

class Game(models.Model): #モデル名は単数形で！
    title  = models.CharField(max_length=200)

    def __str__(self):
        return self.title
```

## マイグレーションの作成
モデル定義を元にマイグレーションを作成します。
マイグレーションを作成する対象のアプリケーションを指定します。

```:makemigrations
python manage.py makemigrations games
Migrations for 'games':
  games\migrations\0001_initial.py
    - Create model Game
```

## adminサイトでモデルを有効化する
[管理サイト](http://localhost:8000/admin)にアクセスするとモデルを編集できるようになります。

```python:mysite/games/admin.py
from django.contrib import admin

from .models import Game

admin.site.register(Game)
```

## URLマッピングを設定
まず、mysiteのurls.pyにgames.urlsへの参照を追加します。

```python:mysite/mysite/urls.py
from django.urls import path, include
from django.contrib import admin

from django.contrib.auth import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/login/', views.LoginView.as_view(), name='login'),
    path('accounts/logout/', views.LogoutView.as_view(next_page='/'), name='logout'),
    path('games/', include('games.urls')),
]
```

続いて、gamesのurls.pyにURLマッピングを追加します。

```python:mysite/games/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```
## ビューの定義

```python:mysite/games/views.py
from django.shortcuts import render

from .models import Game

def index(request):
    games = Game.objects.all
    return render(request, 'games/index.html', {'games': games})
```

## テンプレートの定義

```html:mysite/games/templates/games/index.html
{% extends 'games/base.html' %}

{% block content %}
    {% for game in games %}
        <div class="game">
            <div class="title">
                <p>title: {{ game.title }}</p>
            </div>
        </div>
    {% endfor %}
{% endblock %}
```

```html:mysite/games/templates/games/base.html
{% load static %}
<html>
    <head>
        <title>Django Girls blog</title>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
        <link href='//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
        <link rel="stylesheet" href="{% static 'css/games.css' %}">
    </head>
    <body>
        <div class="page-header">
            <h1><a href="/">Hello Django</a></h1>
        </div>
        <div class="content container">
            <div class="row">
                <div class="col-md-8">
                {% block content %}
                {% endblock %}
                </div>
            </div>
        </div>
    </body>
</html>
```