初心者がDjangoのチュートリアルで何をやり何を考えているのか(1)

## 目的
これからプログラミングを学ぼうとする初心者が何をやり何を考えているか記録する備忘録。年をとると学んだことさえすぐ忘れていくので。プラス記事を書くことで最後までやり通すためのモチベーション維持。さらに奇特な方が初心者の質問や疑問に答えてくれると嬉しいなという下心あり。

## 環境
* ThinkPad T440p
* Ubuntu Linux 18.04 日本語 Remix
* Python 3.6.7
* pip 9.0.1
* Django 2.1.3

## 参考サイト
* [Writing your first Django app, part 1](https://docs.djangoproject.com/en/2.1/intro/tutorial01/)
    * Django2.1のチュートリアルを使用。今年の6月頃 Django Girls Tutorialをやった経験あり。ただ日本語版で進めたところ使用ソフトのバージョン違いでひと苦労。Herokuでさらにひと苦労。英語版のほうがすんなり進めたことがあり、今回も英語版で。（の割には Django Girls Tutorial も終盤で挫折している。Gitで何か失敗、よくわからないまま弄ってたら、ゴチャゴチャになってしまい放り投げた。）
* [Python Django チュートリアル(3)](https://qiita.com/maisuto/items/eece9d880d94fd241a0d)
    * この記事をある程度書いてから発見。先人は偉大なり。ありがとうございます。

## 初心者は何をやりどんなことを考えているのか備忘録
※注：初心者が自分の理解のためにメモとして色々付け加えたりコメントしたりしています。

### 1. ディレクトリ作成　
`mkdir pollsdirectory` 
### 2. 仮想環境作成 /pollsdirectoryで　
`python3 -m venv pollsvenv`
このvenvがどんな仕組みでなんでそんなことができるのかよくわかってない。
### 3. 仮想環境立ち上げ　
`source pollsvenv/bin/activate` 
### 4. pip インストール　
`python3 -m pip install --upgrade pip`

### 5. requirements.txt 作成 vim で 
`Django~=2.1.3` を入力
この`~`は何なの？
### 6. pip から Django インストール　
`pip install -r requirements.txt`
### 7. Django でプロジェクト開始　
`django-admin startproject pollsproject`
ここで名前を適当につけてたらディレクトリなのかプロジェクトなのかアプリなのか、同じ名前があったりして頭がこんがらがってしまった。チュートリアル通りに命名してもmysiteがサイトなのかプロジェクトなのか、pollsもプロジェクトなのかアプリなのか、これも混乱したので自分なりにわかりやすく命名した。同じ名前のディレクトリには外側・内側と勝手に呼んでいる。

``` 
.pollsdirectory
├── 外側pollsproject →　ただの入れ物
│   ├── manage.py
│   └── 内側pollsproject →　これが Python package
│       ├── __init__.py
│       ├── settings.py
│       ├── urls.py
│       └── wsgi.py
├── pollsvenv
│   ├── bin
│   (略）
└── requirements.txt
```


### 8. サーバー立ち上げ /外側pollsprojectで
`python manage.py runserver`

これで http://127.0.0.1:8000 にロケット離陸のページが出てくる。ここからアプリ作成とのことなので、再確認しておく。
* pollsdirectory はここで作業するよという作業場、ここで仮想環境を作った
* 外側pollsproject はプロジェクトでただの入れ物、ここに manage.py あり。
* 内側pollsproject が実際の python パッケージ。

### 9. 外側pollsprojectで 
`python manage.py startapp pollsapp`　
これでpollsappが作成された。データベースとか pollsapp ディレクトリが新たに作られている

```
.外側pollsproject
├── db.sqlite3
├── manage.py
├── pollsapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── 内側pollsproject
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   ├── settings.cpython-36.pyc
    │   ├── urls.cpython-36.pyc
    │   └── wsgi.cpython-36.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

```

### 10. /pollsapp で views.py を改変

もとは下記の内容だった。

```
from django.shortcuts import render

# Create your views here.
```

それを以下のように改変

```
from django.http import HttpResponse  

    # djangoのhttpから　HttpResponseをインポートせよ？
    # HttpResponse はどうもインスタンスみたいだが…


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

    # 関数？リクエストがあったら HttpResponse を返せ？
    # このindex関数が index veiw ってことか？
        # You have now wired an index view into the URLconf.
    # > view は HttpRequest を受け取って HttpResponse を返す変数です
    # → https://qiita.com/maisuto/items/eece9d880d94fd241a0d

``` 
### 11. /pollsapp で urls.py を改変

```
from django.urls import path
    
    # djangoのurlsからpathをインポートせよ？

from . import views
    
    # 今いるディレクトリからviewsをインポートせよ？

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

    #このURLパターンだったらviews.indexを返せ？
```
### 12. pollsproject/urls.pyに追加で書き込み
```
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('pollsapp.urls')),
    path('admin/', admin.site.urls),
]
    # ああこれって配列か！（by 参考サイト）
    # 配列ってこうやってurlを格納することもできると…
    # > url関数ではurlとview,もしくはurlとurlpatternsを結びつけます
    # → https://qiita.com/maisuto/items/eece9d880d94fd241a0d
    # pollsproject/urls.pyがroot_urlのこと？urls.pyをurl関数って呼んでる？

```

でようやくサイト表示ができる。
http://127.0.0.1:8000/pollsapp/
成功していると Hello, world が表示される。ということは pollsapp はディレクトリか。アプリだアプリだと言っておきながらディレクトリなのか。

以上12工程を経てチュートリアルの(1)は修了した。次回はチュートリアル(2)に挑戦。