【Django入門】簡単なブログページを作る際の大まかな流れ　～アプリケーション編～

はじめに
===
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<小栗>です。
「プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

この記事は、[【Django入門】簡単なブログページを作る際の大まかな流れ　～プロジェクト編～](https://qiita.com/keitaro-o/items/50a78c52eeffcbab5b06)
こちらの記事の続きです！

[Django Brothers](https://www.djangobrothers.com/)というサイトをまとめた
記事になっているので、Django初心者にはおすすめです！

アプリケーションとは
===

前回の記事の内容であるプロジェクトは「ウェブサービス全体に関する設定」であるのに対し、アプリケーションとは「ウェブサービスに必要な機能を実現する部分」のことを指します。

アプリケーションを作成する
===


コマンドは```python manage.py startapp```です。

```terminal:/django_blog/
python manage.py startapp blogs
```
ここで、作られたblogsというディレクトリがアプリケーションの一つであり、blogsディレクトリ内のファイルにコードを書いていきます。

アプリケーションを登録する
===
先ほど作成した```blogs```アプリケーションをDjangoプロジェクトに登録する必要があります。

setting.pyファイルを開いて、```INSTALLED_APPS```の部分に`'blogs'`を追加します。

```python:django_blog/django_blog/setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
     'blogs', 　#追加する
]
```
※アプリケーションを作ったら同様に追加します。

Djangoアプリケーションの全体像を把握する
===

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425601/8c4f90a9-abb1-fd94-72bb-9c5e96204cf8.png)

[DjangoBrothers](https://www.djangobrothers.com/)とは順番が違いますが、先に全体像を把握しておいた方が、理解が深まったので先に上の画像でイメージをつかんでおくと良いと思います。

それぞれの大まかなはたらきは、以下です。
#####View
ユーザーは特定のURLにアクセスするとサーバーに対しリクエストを送ります。
そのユーザーからのリクエストをもとに、どのようなHTMLファイルを表示させるか（どのTemplatesを返すか）、どういった内容のデータを表示させるか決める処理をしています。

#####URL
URLに応じてどのViews関数を使うか指定する。


HTMLファイルでページを作成する
===
####トップページを作成する

``django_blog/blogs/``ディレクトリ内に``templates``ディレクトリ、その中に```blogs```ディレクトリを作成し、
```django_blog/blogs/templates/blogs/```という階層を作ります。

そして、この```django_blog/blogs/templates/blogs/```内に
```index.htmlファイルを作成し、任意の内容に編集します。

View
===

先ほど上でも紹介したので、Viewについては細かい内容をまとめます。

```python:django_blog/blogs/views.py
from django.shortcuts import render

def index(request):
    return render(request, 'blogs/index.html')
```

```views.py``` ファイルに上記のコードを書きます。
この関数の内容を分解します。

#####``index``関数の意味
ユーザーからの情報をもとに、index.htmlを返す関数

#####``index``関数の引数である``request``について
``request``はユーザーがURLを入力してサーバーにアクセスするときの情報

#####``render``メソッドについて
``request``をもとに``index.html``を表示することを意味している


URLの設定
===
先ほど作成したhtmlファイルをブラウザ上で表示される様にindex関数とURLを結びつけます。

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blogs.urls')),
]
```
``urls.py``ファイルを上記の内容に書き換えます。
内容を分解してまとめます。

二行目に追加した``include``によってinclude関数が使えるようになります。

#####``path('', include('blogs.urls'))``がしていること
最初の``''``が意味するのは、URLが何も指定されていない事を示しています。
なので、pathの1行は``http://127.0.0.1:8000/``にアクセスした場合、``blogs.urls``ファイルを参照することを意味しています。
#####blogs.urlsについて
blogs.urlsファイルはblogsディレクトリ内に作成するurls.pyファイルのことです。
以下で内容をかみ砕いて説明します。

###blogsアプリケーション内でURLを設定する
今まで触ってきたurls.pyファイルは``django_blog/django_blog/``内のファイルでした。
つまり、プロジェクト内全体のURLを設定していたという認識です。
次はアプリケーション内のURLを設定するので、``django_blog/blogs/``内に新たにurls.pyファイルを作成して編集します。

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

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

#####``path``関数について
第一引数で空の文字列を指定し、第二引数で``views.index``を指定しています。
これは、URL（http://127.0.0.1:8000/）にアクセスした時は、views.pyのindex関数を実行するように設定をしていることを意味します。
第三引数はURLパスに名前を付けているという事です。