Python + Djangoのプロジェクト作成

# Djangoのプロジェクト作成とアプリケーションの追加を整理します。
※ 2020.04.29 リニューアル

## projectを作成する

「mysite」というプロジェクトを作成するものとします。

```shell:
$ django-admin startproject mysite
$ cd mysite
```
動かしてみる。

```shell:
$ python manage.py runserver
```

[http://127.0.0.1:8000](http://127.0.0.1:8000)にアクセスするとロケットが飛び立ちます。

Django3ではasgiで動かすこともできます

```shell:
$ pip install gunicorn uvicorn
$ gunicorn -k uvicorn.workers.UvicornWorker mysite.asgi:application
```

## first step

プロジェクト作成すると、以下のディレクトリ／ファイルが作成されています。

```text:
mysite
│  manage.py
└─mysite
        asgi.py
        settings.py
        urls.py
        wsgi.py
```

### 「settings.py」を編集していきます。

#### (1)　Django Templateを利用するための設定

「TEMPLATES」を以下のように変更します。

```python:settings.py
・・・
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
#        'DIRS': [],
        'DIRS': [
          os.path.join(BASE_DIR, 'templates'),
        ],
```

#### (2)  STATIC FILEを使用するための設定

STATICFILES_DIRS を追加します。「STATIC_URL」の下などがといいでしょう。

```python:settings.py
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)
```

#### (3) データベースをpostgresqlに変更する場合

「DATABASES」を以下のように編集します

```python:settings.py
・・・
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'djangodb',
        'USER': 'testuser',
        'PASSWORD': 'secret',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
```

#### (4)  ディレクトリを作成する。

プロジェクトの直下にtemplates, staticを作成します。

```text
mysite
│  manage.py
├─mysite
│  │  asgi.py
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
├─static
└─templates
```

#### (5)  LANGUAGE_CODEとTIME_ZONEを変更

```python:settings.py
・・・
LANGUAGE_CODE = 'ja-JP'

TIME_ZONE = 'Asia/Tokyo'

```

## projectにアプリを追加する

### (1) projectにアプリを追加する

以下のコマンドを実行してアプリケーション（myappとします）を追加します

```shell:
$ django-admin startapp myapp
```

以下のようなディレクトリ／ファイルになっています

```
mysite
│  db.sqlite3
│  manage.py
│  
├─myapp
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │  
│  └─migrations
│          __init__.py
│          
├─mysite
│  │  asgi.py
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  └  __init__.py
│          
├─static
└─templates
```

### (2) urls.pyをアプリに追加して以下のように編集します

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

app_name = 'myapp'
urlpatterns = [
    path('', views.index, name='index'),
]
```

```
├─myapp
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  urls.py
│  │  views.py
```

### (3) views.pyを以下のように編集します

```python:myapp/views.py
from django.http import HttpResponse

def index(req):
  return HttpResponse('Hello World')
```

### (4) mysite/urls.pyにmyappのpathを追加する

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

urlpatterns = [
    path('myapp/', include('myapp.urls')),
    path('admin/', admin.site.urls),
]

```

### (5) mysite/settings.pyにmyappを追加する

```mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp', # 追加
]
```

確認してみましょう。「Hello World」が出力されればOKです。

```shell:
$ python manage.py runserver
$ curl http://127.0.0.1:8000/myapp/
Hello World
```

## Django Templateを使う

Django Templateを使ってHTMLを表示するアプリを作成する

### (1) projectにアプリを追加する

```shell
django-admin startapp myapp2
```

### (2) urls.pyをアプリに追加して以下のように編集します

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

app_name = 'myapp2'
urlpatterns = [
    path('', views.index, name='index'),
]
```

### (3) views.pyを以下のように編集します

Django templateを使う場合は、renderを使います

```python:myapp2/views.py
from django.shortcuts import render
def index(request):
    return render(request, 'myapp2/index.html')
```

### (4), (5)は前述と同様なので省略します。

### (6) htmlを追加します。

cssファイルなどを使う場合は、{% load static %}と記述して、linkタグに{% static 'css/styles.css' %}などと記述します。

```html:myapp2/index.html
{% load static %}
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
    <link rel="icon" href="#">
    <link href="{% static 'css/styles.css' %}" rel="stylesheet">
    <title></title>
  </head>
  <body>
      hello djnago template
  </body>
</html>
```

以下のようなディレクトリ／ファイルになっています

```
├─static
│  ├─css
│  │      styles.css
│  └─js
└─templates
    └─myapp2
            index.html
```

確認してみましょう。うまくHTMLが表示されたでしょうか。

```shell:
$ python manage.py runserver
$ curl http://127.0.0.1:8000/myapp2/
```

今回はここまで。