Djangoチュートリアル（ブログアプリ作成）① - 準備、トップページ作成編


今回は Django を使って、記事を投稿できるブログアプリを作成していきます。

## Django とは？

Django は Python で実装できる Web アプリケーションフレームワークです。

フレームワークとは、アプリケーションを開発する際に使われる機能がまとまったソフトウェアです。
フレームワークを導入することで、効率よく Web アプリを進めることができます。

今回は Blog アプリを作っていきますが、Django を使えばデータベースを用いた、コンテンツ管理システムや Wiki からソーシャルネットワーク、ニュースサイトなど、高品質な Web アプリケーションを簡単に、少ないコードで作成できます。シンプルな Web アプリケーションであれば、数分間で作れてしまう場合もあります。もちろん、機能を拡張して複雑な Web アプリケーションを作成することもできます。

また、Django は、Instagram など、有名な Web アプリでも使われており、Ruby でいう Ruby on Rails に相当する注目のフレームワークとなっています。

## 環境構築

まずは作業用のディレクトリを作成します。
ここでの名前はなんでもよいですが、とりあえず blog としておきます。

```
mkdir blog
cd blog
```

### pipenv のインストール

ベースとなる環境は汚さない方が他のモジュールなどの影響を排除できるため、pipenv を使って仮想環境を構築しましょう。

```
pip install pipenv
# 環境によっては直接 pip を使えない場合もあるので、python3 -m pip install pipenv でインストールします
```

インストールできたら、作業用フォルダの中で下記のコマンドを実行します。

```
pipenv shell
```

実行後、仮想環境に入ることが出来るとディレクトリ名に従った文字列がコマンドラインの冒頭に表示されるようになります。

```
(blog)bash-3.2$
```

### Django をインストール

直接 pipenv install django とでも実行して Django をインストールしてもよいですが、
後々 Docker を使うことを考えて、requirements.txt というファイルを作業用ディレクトリ直下に作成して
必要となるモジュールを記述していくことにします。

いまは Django だけが必要なので、バージョン情報とともに以下のように記載します。

```requirements.txt
Django==3.1.0
```

※今回は Django 3.1.0 で作っていきますが Django 2.2 あたりでも問題なく動くとは思います

### モジュールのインストール

下記のコマンドを実行することで、requirements.txt に基づきモジュールをインストールします。
ここでは Django だけがインストールされるはずです。

```
pipenv install -r requirements.txt
```

## Django プロジェクトの作成

blog ディレクトリ直下で実行

```
django-admin startproject mysite
```

親プロジェクト直下でのファイル構成はこのようになっているかと思います。

```
├── Pipfile
├── Pipfile.lock
├── mysite
│   ├── manage.py
│   └── mysite
│       ├── __init__.py
│       ├── settings.py
│       ├── urls.py
│       └── wsgi.py
└── requirements.txt
```

### Django サーバのテスト起動

開発用サーバを起動する機能がついています。
(Ruby on Rails をやったことがある人は rails -s というと分かりやすいかと思います)

これを実行するには manage.py ファイルが置いてあるディレクトリに移動する方が便利なので、mysite/mysite ディレクトリに移動してから実行します

```
cd mysite
python3 manage.py runserver
```

正常に実行できると下記のような出力が出ます。

```
October 16, 2020 - 21:30:23
Django version 3.1, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

なお、この部分は migrate というデータベースへの統合処理が済んでいないために出力されるメッセージですが、いまのところ気にしないで大丈夫です。

```
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
```

さて、これで Django の開発用サーバが起動したのでブラウザから確認します。
Chrome などのブラウザのアドレスバーに「127.0.0.1:8000」と入力して Enter を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/2b1e7c61-21ad-5412-aafe-8890fba1c347.png)

これがすべての始まりです。この画面が出ていれば、最初のステップは完了しています！おめでとうございます。

## プロジェクトの設定

さて、先ほどテストサーバへアクセスした時に英語での表記になっていましたね。
こういった設定は mysite/settings.py で設定することができ、デフォルトでは英語圏に合わせた言語表示、およびタイムゾーンになっています。

```python:mysite/settings.py(before)
LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'
```

これを次のように変更してあげます。

```python:mysite/settings.py(after)
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'
```

もう一度テストサーバへアクセスすると、日本語表記になっていることが分かるかと思います。
（また、この画面からでは確認できませんがタイムゾーンも東京設定になっています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/0d9b8fed-8226-1619-0c2f-aa2b9f866c08.png)

## Django アプリの作成

先程 start-project コマンドでプロジェクトを作成しましたが、次はアプリケーションを作っていきます。
混乱しがちですが、ベースとなるプロジェクトと個別のアプリは別物です。

公式ページではこのような説明です。

> プロジェクトとアプリの違いは何でしょうか？ アプリとは、ウェブログシステム、公的記録のデータベース、小規模な投票アプリなど、何かを行う Web アプリケーションです。プロジェクトは、特定のウェブサイトの構成とアプリのコレクションです。プロジェクトには複数のアプリを含めることができます。 アプリは複数のプロジェクトに存在できます。

では、blog アプリを作っていきましょう。mysite プロジェクトリ (manage.py ファイルがある場所) の直下で下記コマンドを実行します。

```
python3 manage.py startapp blog
```

現在のディレクトリ構成はこのようになっています。

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

blog 配下に様々なファイルが作成されていることが分かるかと思います。

ここで、このアプリが作成されたことをプロジェクトに教えてあげる必要があります。

mysite/setting.py の中に "INSTALLED_APPS" という欄がありますので、その中で blog アプリの存在を教えてあげましょう。

```python:mysite/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog.apps.BlogConfig', # ここを追加
]
```

## template, view, url の設定

まずは「 template をそれぞれ変更していきます。

template は見た目を作るための部分であり、html ファイルに相当します。

mysite プロジェクト直下に templates フォルダ、その下に blog フォルダ、さらにその下に index.html を作成します。

```
.
├── blog
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── templates
    └── blog
        └── index.html ←ここに作成
```

index.html の中身はとりあえず適当で大丈夫です。

```html:index.html
<h1>Hello, from Django!</h1>
```

また、templates フォルダをどこに作ったかをプロジェクトに教えて上げる必要があります。
INSTALLED_APPS を設定したときと同様に、settings.py に下記の記述を入れます。

```python:settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')], # ここを修正
        'APP_DIRS': True,
```

次に views.py を修正していきます。
先ほど作った template である index.html を呼び出します。

```blog/views.py
from django.views.generic import TemplateView

class IndexView(TemplateView):
    template_name = 'blog/index.html'
```

### URL の設計

次に、blog アプリ専用のルーティング設定を作成します。
ルーティング設定は「urls.py」というファイルで設定していきます。

まずはじめに説明をしますと、プロジェクト全体のルーティングを司る urls.py と、アプリ内の urls.py それぞれでルーティングを設定します。

最初に mysite 直下の urls.py から編集します。

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

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

後に作成する blog アプリ用の urls を、urlpatterns 内で読み込むことになります。

では mysite 直下にのみ urls.py が作成されていますが、blog 直下にも自分で「urls.py」を作成します。
エディタでもよいですし、アプリの blog ディレクトリ内で下記コマンドを実行してもよいでしょう。

```python:/blog
touch urls.py
```

blog 配下はこのようなファイル構成です。

```
.
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
├── urls.py
└── views.py
```

作成した urls.py の中身はこのように変更することで、先程 views.py で作成した関数（＝ index.html を呼び出す処理）のルーティングを設定します。

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

app_name = 'blog'

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
]
```

ちなみに name='index' を設定しておくことで「blog:index」という名前を使ってこの url を逆引きで呼び出すことができるようになります。

この時点で index.html を呼び出せるかの確認を行います。

manage.py が置いてあるディレクトリで runserver を実行します。

```
python3 manage.py runserver
```

無事に通ったら、今度はブラウザで　**127.0.0.1:8000/blog** へアクセスします。
これは先程 mysite/urls.py で blog 付きのアドレスでアクセスされたときに、blog アプリ内に記述した内容を動作させるようにしているためです。

アクセスし、index.html の中身が表示されれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364501/22e09cb4-31aa-3268-676e-207f5afd0f24.png)

次回は models を作成し、実際に記事を登録するための準備をします。

→ 続き：
[Django チュートリアル（ブログアプリ作成）② - model 作成、管理サイト準備編](https://qiita.com/tmasuyama/items/452c20f6014e76620b3a)