【① Python × Django】入門 Djangoのチュートリアルやってみた !

# 目的
Djangoを使って投票アプリを作る
アプリ名 : PollApp
(Poll : 投票)

# 始める前の気持ち
Djangoのチュートリアルをやってみる！
Djangoの使い方を大体理解する!
WEBサイト作れるようになりたい！

# 流れ
① : Python , Django の環境構築(省略)
② : Django の「はじめての Django アプリ作成、その 1」(公式サイトのチュートリアル)を行う

# 環境
PC : Macbookpro 2021 (M1Pro)
OS : MacOS Monterey (12.0)
仮想環境 : Anaconda
ライブラリインストール : ターミナル,pip
テキストエディタ : VSCode
ブラウザ : GoogleChrome

# ② : Django の「はじめての Django アプリ作成、その 1」(公式サイトのチュートリアル)を行う - 1

早速、Djangoのチュートリアルをやっていきます！
まずは、下のURLをクリック！<br>

**はじめての Django アプリ作成、その 1 - Django公式ドキュメント(https://docs.djangoproject.com/ja/3.2/intro/tutorial01/)**


### 1. (仮想環境に) Djangoがインストールされているか確認<br>

```ターミナル.sh
(仮想環境名) ~~~$ python -m django --version

3.2.9
```



### 2. プロジェクトを作成

cd を使いプロジェクトを置きたいフォルダに移動

```ターミナル.sh
(仮想環境名) ~~~$ cd 〜〜〜
```
<br>

プロジェクト(mysite : 任意) を作成
*※ プロジェクト名(今回はmysite) は djangoやtest 以外を使用すること。Pythonモジュール,Djangoのコンポーネントと同じ名前をつけるとエラーが起きる可能性あり。*

```ターミナル.sh
(仮想環境名) ~~~$ django-admin startproject mysite
```
<br>

### 3. ファイル構造を確認

```
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
```

<br>

### 4. ファイル名と役割を確認

- **manage.py** : <br>Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティです｡詳しくは django-admin と manage.py 内の manage.py を参照してください｡
内側の mysite/ ディレクトリは、このプロジェクトの実際の Python パッケージです。この名前が Python パッケージの名前であり、 import の際に 使用する名前です (例えば import mysite.urls) 。

- **__init__.py** :<br>ほとんど触ることはないため、無視していい。Python関連のパッケージをインポートする際に読み込まれる初期化ファイル。

- **asgi.py** :<br>必要となる機会は少ない？ Djangoにリアルタイムな双方向通信機能を持してデプロイ/稼働する際に必要となる。

- **settings.py** :<br>よく使う。プロジェクトのディレクトリ指定や各ファイルの指定、その他プロジェクトに関するすげての設定がここで記述される。

- **urls.py** :<br>プロジェクトのルーティングを設定するために使用する。各アプリケーションにそれぞれurls.pyを手動で追加し、各アプリケーション内のurls.pyに読み込んで、プロジェクト全体のルーティングを記述する。書き方はほぼ定型となっている。

- **wsgi.py** :<br>Djangoを デプロイ/稼働 する際に必要となる。

- **manage.py** :<br>Djangoの全てのプログラムのトリガーとして使用する。アプリケーションを追加する場合やDBを更新する場合は必ず記述を行う。



### 5. サーバーを動かす

コマンドcd を使用して manage.py が存在するフォルダに移動する。 

サーバーを動かすため以下のコマンドを入力
※ 警告が出るが今は無視する

```ターミナル.sh
$ python manage.py runserver



Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

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.
November 13, 2021 - 11:54:39
Django version 3.2.9, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

※ このサーバは開発中の利用だけを考えて作られています。絶対に運用環境では 使わないでください (筆者たちの専門は Web フレームワークであって、Web サーバではありません)。


##### おまけ
ポート番号を変更したいときは以下のコマンドを入力
今回はポート番号 8000 を指定

```ターミナル.sh
$ python manage.py runserver 8000
```


### 6. サーバーが動いているか確認

↓ローカルホストへアクセスし、サーバーが動いているか確認

 http://127.0.0.1:8000/

<br>

正常に動いている場合は、下図のような表示になる
下図が表示されると、プロジェクト作成は成功です。
次はアプリケーション(PollApp)を作成していきましょう！！！

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/232d08b3-9edc-83f1-c209-4ce4b794643c.png">

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


# ② : Django の「はじめての Django アプリ作成、その 1」(公式サイトのチュートリアル)を行う - 2

### 1. アプリケーションフォルダ(PollApp)を作成する

manage.py が存在するファイルへ移動し、アプリケーション作成のコマンドを入力する

*python manage.py startapp アプリケーション名*

```ターミナル.sh
$ python manage.py startapp PollApp
```

### 2. アプリケーションのファイル構造を確認

```
PollApp/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

```

### 3. ファイルの名前と役割を確認


- **__init__.py** :<br>ほとんど触ることはないため、無視していい。Python関連のパッケージをインポートする際に読み込まれる初期化ファイル。

- **admin.py** :<br>管理画面で表示するデータの設定や機能追加を行う。(Djangoではプロジェクトの作成と同時に自動でデータの管理画面が作成される) 管理者画面の立ち位置のため、会員登録機能などで作られる "ユーザー" では関与することができない。スタッフ権限を持ったユーザーのみがログインして閲覧できる。

- **apps.py** :<br>アプリケーションの設定を記述することでプロジェクトのsetting.pyで読み込めるようにしている。デフォルトで必要なコードが記述されているため、ほとんど触れることはない。

- **models.py** :<br>DBに登録するテーブルを記述していく。基本的にClassベースで記述を行い、最終的にmigrateというアクションでデータ構造をDBに登録する。

- **tests.py** :<br>Djangoの持つユニットテスト機能を行える。開発で使用しているDBとは別にダミーのDBを立てることができ、それを使用してテストを行う。

- **views.py** :<br>**最重要** Djangoプロジェクトの中核を担う。バックエンドとなるファイル。このファイルに、models.pyからClassを読み込んだり、各種パッケージ機能などを読み込んだりしながらhtmlファイルの設定や投げるデータの登録、バックエンドとしての機能を持たせることができる。

- **( urls.py )** :<br>手動でアプリケーションフォルダ内に作成することが多い。ここで、views.pyで作成したClassまたは関数を読み込んでアプリケーション内のルーティングを登録する


### 4. コードを書く前の確認

※ VSCodeのターミナルでプログラム実行する場合は必要 , それ以外は読み飛ばして良い。筆者はVSCodeのターミナルを使用しない予定。

コードを書く前に VSCode で仮想環境の確認・変更を行います。
画面左下の「Python 3.9.7~~~」を押す
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/d22fae81-5e65-61d8-e0ca-754b9e2922c9.png">

自分が環境構築した仮想環境を指定する
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/047142c0-5194-47a1-1764-a523b06eef7c.png">


### 5. Viewを作成する

**Viewを記述**
PollAppフォルダ内の views.py に下のコードを追加する。

```PollApp/views.py

from django.http import HttpResponse


def index(request):
    // 文字列 "Hello, world. You're at the polls index." が画面に表示される
    return HttpResponse("Hello, world. You're at the polls index.")

```

<br>

**アプリケーションのURL?設定**
Viewを表示するため、URLを対応づける必要がある。
PollAppフォルダ内に **urls.py を 新規作成** する。
<br>
PollAppのフォルダ構造

```
PollApp/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py   ←------------------- NEW!
    views.py
```

<br>

PollApp/urls.py に下のコードを追加

```PollApp/urls.py

from django.urls import path

from . import views

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

```


<br>

**プロジェクトファイルのURL設定**
PollApp.urls モジュール( ≒ PollApp/urls.py ) の記述を反映させるため、
mysite/urls.py に下のコードを追加する。

```mysite/urls.py

from django.contrib import admin
from django.urls import include, path

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

```


### 6. path()の引数を確認

path()には4つの引数が存在します。
route , view , kwargs , name です。
route,view は path() を呼び出すときに必須です。

え？でも、 5 で mysite/urls.py に追加したコードには routeとかviewとか　っていうコードなかったじゃんって？

その通りです。

5 で記述した path(・・・)　のように route,view,kwargs,name という引数名をわざわざ書かなくてもいいんです！

しかし、どの引数にどのようなデータを渡しているのか確認したいですよね。今からコードを使って確認しましょう。
pathに引数名を使用して引数を指定すると,下のようなコードになります。
データを渡さない場合は "" を渡している。

**path(route = "PollApp/" , view = include("PollApp.urls") , kwargs = "" , name = "")**<br>
**→ path( route = ① , view = ② , kwargs = ③ , name = ④ )**

①〜④ について説明していきます。

- **① route** :<br>"test_route1/test_route2/" のようにURLパターンを含む文字列。「リクエストを処理するとき、Django は urlpatterns のはじめのパターンから開始し、リストを順に下に見ていく。要求された URL を一致するものを見つけるまで各パターンと比較する。」

- **② view** :<br>表示するView(Viewの関数)の指定。Viweを呼び出すときにはキーワード引数として、View関数へrouteの文字列が渡される。「Django がマッチする正規表現を見つけると、 Django は指定されたビュー関数を呼び出す。その際 HttpRequest オブジェクトを第一引数に、そしてキーワード引数としてrouteから「キャプチャされた」値を呼び出す。」

- **③ kwargs** :<br>任意のキーワード引数を辞書として対象のViewに渡せる。チュートリアルでは使わない。

- **④ name**:<br>URLに名前付けが行える(→筆者 2021_1114時点で 詳しくは理解していない)「URL に名前付けをしておけば Django のどこからでも明確に参照でき、とくにテンプレートの中で有効。この便利な機能のおかげで、プロジェクトのURLにグローバルな変更を加える場合にも1つのファイルを変更するだけで済むようになる。」らしい



### 7. 作成したViewが正常に表示されるか確認

6 までのコードを追加し、ターミナルで下のコマンドを入力する。

```ターミナル.sh
$ python manage.py runserver
```

<br>

下のURLにアクセスする

 http://localhost:8000/PollApp/


<br>
表示画面を確認
**成功！**

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764557/1507565d-55c0-c194-5cc8-ac6461b7a45d.png">


### チュートリアル1 は終了

お疲れ様でした！
チュートリアル2を行い次第、記事を投稿します






# 参考 : 

↓プロジェクトファイル内のプログラム/アプリケーション内のプログラム 解説

https://just-python.com/document/django/introduction/directory