昼飯データベースを作りたい　【EP1-1】はじめてのDjango勉強編

#Webアプリを作りたい
ということでPythonのDjangoを勉強しようと思った次第です。
DjangoとはPythonのWebフレームワークのことらしいです。
フレームワークって何？という感じですが、公式サイトには"Django makes it easier to build better Web apps more quickly and with less code."とあるのでたぶんそういうものなんでしょう。
有名なところではYoutubeやDropbox、instagramもDjangoで作られているらしいです。
すごい、、、

注）この記事は「Djangoの公式プロジェクトのチュートリアルやってみた」です。

追記）全4回の記事になります。公式のチュートリアルとは以下のように関連します。
チュートリアルに入る前の下準備~チュートリアルその1
本記事
チュートリアルその1~3
[昼飯データベースを作りたい【EP1-2】はじめてのDjango勉強編](https://qiita.com/EconUC/items/408ae1a7118fe8078369)
チュートリアルその3~5
[昼飯データベースを作りたい【EP1-3】はじめてのDjango勉強編](https://qiita.com/EconUC/items/b9048d917159db35a860)
チュートリアルその5~7
[昼飯データベースを作りたい【EP1-4】はじめてのDjango勉強編](https://qiita.com/EconUC/items/99e462c93c5540a84246)

#環境構築
兎にも角にもまずは環境構築から、

* Pythonを用意します
* Djangoを入れます
* 適当なテキストエディタを入れておきます

この3点を抑えれば、Djangoのスタートはできると思います。
私の場合はWindows10 1909で

* Anaconda-1.7.2
* Django-3.0.8
* Visual Studio Code-1.47.2

で用意しました。以下がセットアップ時に参考にしたリンクです。
<details><summary>参考リンク</summary>
[Djangoを最速でマスターする part1](https://qiita.com/gragragrao/items/373057783ba8856124f3)
[django公式ドキュメント-チュートリアル](https://docs.djangoproject.com/ja/3.0/intro/tutorial01/)
[Python環境構築(Anaconda + VSCode) @ Windows10 【2020年１月版】](https://qiita.com/manamana/items/38e963ce04f24de4bbe4)
</details>

#はじめの一歩
Djangoをインストールしたら次に仮想環境を構築しました。
これでわかるかもしれませんが一歩の進みはかなり遅いです。ご容赦くださいませ。

だいたい仮想環境の構築では`pyenv`か`venv`の記事が多いので、今回自分が`Anaconda`で作るときに
少し戸惑いながらの構築になりました。
`Anaconda`はGUIがかなりわかりやすくできているので、正直コマンドを全く打たないで仮想環境の構築が可能です。
なので、初心者にはもしかしたらとっつきやすいかもしれません。
以下`Anaconda`Navigatorでの設定画面になります。

1．左のメニューにあるEnviromentをクリックして仮想環境設定の画面に入る
![2020-07-30_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/d1b79758-0180-2d3f-3507-7881e6fad38b.jpeg)

2．新しい環境をクリエイトする
名前はわかりやすいもので自由に決めましょう。
（私はDjangoとつけてしまいましたがもしかしたら名前空間の衝突があるかもしれないです）
![2020-07-30 (1)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/6b93d7bb-5556-7047-d8ac-db074fbf1418.jpeg)

3．Django用の仮想環境を作ったら、その仮想環境を選択し、必要なライブラリを__検索窓__で探して仮想環境に入れます。
![2020-07-30 (2)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/285743f9-e864-ec0b-b2c7-a4c77c7e57d3.jpeg)

#プロジェクトを作ろう
仮想環境が作れたら`Anaconda`Promptから仮想環境を起動して、作業ディレクトリに入ってプロジェクトを作ります。

```:cmd
(base)C:\User>conda activate Django
(Django)C:\User>django-admin startproject mysite
```

これで`mysite`ディレクトリが作られ、その中にプロジェクトを始めスターターキットのようなコードが自動で作られます。

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

チュートリアルに全く同じ解説があるので詳しくは割愛しますが、基本的な動きは`manage.py`によって統括され、`urls.py`がサイト内のルーティングを担います。
詳しい記事⇒[code for django-django（フレームワーク）の仕組みを分かりやすく解説【徹底的にかみ砕きます】](https://codor.co.jp/django/understand-concept-of-django-framework)


まずは、Webサーバーを動かしてみましょう！

```:cmd
(Django)C:\User\mysite>python manage.py runserver
```

これでサーバを立てることに成功しました。
わかる人はわかると思いますが、ここで立てたのは開発サーバーでいわゆるお試し用です。
実際は`Apache`などをいれて運用します。

というわけで、立てた開発サーバーを確認しましょう。
ブラウザで127.0.0.1:8000と入れると
![2020-08-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/7a515e4f-f6db-d46b-87cd-256b37414ec4.png)
こんな感じのロケットが飛んでいる画面が出ていたらオッケーです。
127.0.0.1:8000は127.0.0.1がループバックアドレスであることから自身の8000番ポートを表しており、このページは自分のパソコンの中の8000番ポートでdjangoが動いているということを表しています。

#pollアプリケーションを作る
チュートリアルではここで投票アプリケーションの作成に入ります。
まずはアプリケーションのひな型を作ります。

```:cmd
(Django)C:\User\mysite>python startapp polls
```

これでpollsという名前でディレクトリが作成され、その中にはアプリケーションを構築する基本的なスクリプトがすでに入っています。

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

この`views.py`というスクリプトがページの見た目を司ります。
では、この`views.py`を少しいじって見た目を変えていきます。

ここからvscodeを使って編集していきます。

vscodeにはプラグインで日本語化とPythonの拡張機能、最近話題になっていたので導入してみたPylanceを入れています。

vscodeの画面を開くとこんな感じです。
![2020-08-02 (1)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/731597f3-3313-11ff-68df-cc26adb8b2bf.jpeg)

`views.py`に以下のスクリプトを追加します。

```python

from django.http import HttpResponse

def index(request):
#適当な言葉を入れました
    return HttpResponse("こんにちは！")
```

チュートリアルとは`return`の`HttpResponse`の中身が違いますが、ここは表示メッセージなので好きなのを入れました。

そしてこの関数を表示させるために`urls.py`でルーティングの設定をします。
※ここで設定するのはpollsのディレクトリに入っている`urls.py`です。mysiteのディレクトリの階層にも`urls.py`がいるので気をつけましょう。ここでは深いほうの`urls.py`に書いています。

```python:polls/urls.py
from django.urls import path

from . import views

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

`views.py`を呼び出して`urlpatterns`のリストに`views.index`への`path`を入れています。
これだけではまだ`views.index`を呼び出せません。
`mysite/urls.py`にpollsへのルーティングを示す必要があります。

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

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
```
adminはもともと入っています。
pollsへの`path`を追加しました。
`include`は下位の`urls.py`へと動作を渡すために必要な関数です。
ただし`admin.site.urls`は例外。
これで`127.0.0.1:8000/polls`で`views.index`を引くことができるようになりました。

URLディスパッチについての参考⇒[DJangoのお勉強(1)](https://qiita.com/ShimantoAkira/items/ec1130fbd2a65cd5b7f3)

早速確認してみましょう。
![2020-08-02 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/8a296491-6ac0-d47f-d962-33211bc5d52c.png)

かなり寂しいですが、コード通りのレスポンスなのでいい感じです。

#Databaseの設定
`mysite/setting.py`で使用するデータベースの設定をします。
Pythonはありがたいことに`SQLite`という小規模のデータベースが標準で組み込まれています。
こういったところにもPythonの電池付属の哲学を表れています。

```:cmd
(Django) C:\User\mysite>python manage.py migrate
```
これでデータベーステーブルの作成が終わります。あっけなすぎてびっくりですがこういうのもDjangoのいいところでしょうか。
`SQLite`以外のデータベースを使うときは`setting.py`への設定が別途必要になります。

#モデルの作成
pollsアプリケーションの核となるモデルの作成を行います。

```python:polls/models.py
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
```
コードをみるとわかりますが`models.Model`というクラスのサブクラスとして`Question`と`Choice`という二つを定義しています。
さらに、アトリビュートには`Field`を設定しています。
`Field`についてはまだ理解が全然追い付いていないです。精進します。
`models.ForeignKey`は外部のキーを取りに行くやつです。すんません雑です。

#モデルを有効にする
モデルを作ったら次に`setting.py`でモデルを有効にするという作業をして、参照できるようにします。

```python:mysite/setting.py
INSTALLED_APPS = [
    'polls.apps.PollsConfig', #この行を追加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
```

ちなみに`polls.apps.PollsConfig`って何でしょうか？
こいつでした↓

```python:polls/apps.py
from django.apps import AppConfig

#これを呼んでいます。
class PollsConfig(AppConfig):
    name = 'polls'
```
そして`setting.py`への設定を終えたら、

```:cmd
(Django) C:\User\mysite>python manage.py makemigrations polls
```
`makemigrations` <アプリケーション名>とすることでモデルの変更を保存することができました。
以降は`migrate`で行けるってことっぽいです。

長くなってきたので、ここで一回切りたいと思います。
ありがとうございました。
間違いに気づいたら適宜修正します。

次回⇒[昼飯データベースを作りたい【EP1-2】はじめてのDjango勉強編](https://qiita.com/EconUC/items/408ae1a7118fe8078369)