Djangoチュートリアル補足資料

# 注意書き
この投稿は私がDjangoのチュートリアルを学習したときの学習メモアーカイブ用です。
Webアプリを始めて触ったのでとても単純なところから苦戦しました。
ChatGPTを駆使しメモを作成しています。

# Django チュートリアル
[Django Tutorialはこちらから](https://docs.djangoproject.com/ja/5.1/intro/tutorial01/ "Django Tutorial")

# チュートリアル学習メモ
#### ファイルの記述メモ
スライドを作成していましたが、マークダウンメモへ変換しています。
見づらい部分ありますが。。。
```md
django-tutorial

mysite
    manage.py: Djangoプロジェクトに対する様々な操作を行うためのコマンドラインユーティリティ
    urls.py: DjangoプロジェクトのURL宣言。いわばDjangoサイトにおける「目次」に相当
    
    from django.contrib import admin
    from django.urls import include, path

    urlpatterns = [
        path("polls/", include("polls.urls")), #/polls/ というパスのリクエストがきた時にpolls.urlsに渡す
        path("admin/", admin.site.urls),  #requestオブジェクトはDjangoで自動で作成されるオブジェクト。他にもuser,session,messageなどがある。
    ]

pollsアプリ名
    views.py
        from django.http import HttpResponse
        def index(request):
            return HttpResponse("Hello, world. You're at the polls index.")
    
    urls.py: アプリケーションのURLConf
        from django.urls import path   #特定のURLへアクセスしたときにどの関数を呼び起こすかを定義する。今回はhttp;//localhost:8000/pollsにアクセスがあったときを定義している。
        from . import views

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

#"": ルートURL、つまり /polls/ にアクセスしたときに適用されるパスです。""は、追加のパスがないことを意味します。
#views.index: リクエストを処理するために呼び出されるビュー関数です。ここでは、views.py ファイルに定義された index 関数が実行されます。
#name="index": このURLパターンに対する名前を設定しています。この名前を使って、Djangoテンプレート内からこのURLを参照できます。

```
```md
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)

フィールド名 = フィールドタイプ("ラベル")
具体例:
phone_number = models.CharField("Phone Number", max_length=15)
「電話番号」として表示されます。
```
```md
mysite/settings.py

このファイルが読み込まれるタイミング
- サーバーの起動時: python manage.py runserver
- シェルの使用時: python manage.py shell
- 管理コマンドの実行時: python manage.py migrateやpython manage.py makemigrations

INSTALLED_APPS = [
    "polls.apps.PollsConfig",  # pollsアプリケーションがプロジェクトに含まれていることを示します。
    "django.contrib.admin",			#デフォルトで書かれていた
    "django.contrib.auth",			#デフォルトで書かれていた
    "django.contrib.contenttypes",		#デフォルトで書かれていた
    "django.contrib.sessions",		#デフォルトで書かれていた
    "django.contrib.messages",		#デフォルトで書かれていた
    "django.contrib.staticfiles",		#デフォルトで書かれていた
]

$ python manage.py makemigrations polls
Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice

#makemigrations を実行することで、Djangoにモデルに変更があったこと(この場合、新しいものを作成しました)を伝え、そして変更を マイグレーション の形で保存することができました。
マイグレーションは Django がモデル (そしてデータベーススキーマでもあります) の変更を保存する方法です。

```
```md
$ python manage.py shell
>>> from polls.models import Choice, Question  # モデルのインポート
>>> Question.objects.all()  # データベース内のすべてのQuestionオブジェクトを取得
<QuerySet []>
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())  # 新しい質問を作成
>>> q.save()  # データベースに保存
>>> q.id  # オブジェクトIDを取得
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2024, 8, 15, 12, 0, 0)
>>> q.choice_set.create(choice_text="Just hacking again", votes=0)  # 新しい選択肢を作成

```

```md
polls/models.py 追記

from django.db import models
from django.utils import timezone

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

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

#was_published_recentlyメソッドは、アプリケーションの機能の一部として実装されており、特定のビジネスロジックを処理するためのメソッドです。この場合、質問が最近（過去24時間以内）に公開されたかどうかを判定する機能を提供しています。

#このように、ユーザへ表示させるわけではなく、機能を実装するために必要なメソッドは任意のメソッド名にできる。

#この場合、質問が最近（過去24時間以内）に公開されたかどうかを判定する機能を提供しています。

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

#デフォルトでは以下のように該当するオブジェクトのIDを返してしまう
#実行例： Question.objects.all() <QuerySet [<Question: Question object (1)>]>

#そのため、オブジェクトを呼ばれたときに返すデータを明示的に指定するために書いている。

#ユーザへ見せるためのメソッドは__str__メソッドを使用する。

```


#### チュートリアル内容（概要）
##### Tutorial 1:
1. プロジェクトの作成
2. アプリの作成
3. URL設定の追加
4. ビューの作成
5. テンプレートの作成
6. モデルの作成
7. マイグレーションの適用
8. 管理サイトの設定
9. シェルを使ったデータ操作

##### Tutorial 2:
1. モデルの作成
2. マイグレーションと適用
3. 管理サイトでモデルを管理

##### Tutorial 3:
1. ビューの改良
2. テンプレートの作成
3. 404エラーハンドリング
4. 名前付きURLパターンの使用

##### Tutorial 4:
1. 投票フォームの作成
2. POSTリクエストの処理
3. 汎用ビューの使用

##### Tutorial 5:
1. テストの作成
2. `was_published_recently` のテスト
3. 自動テストの実行


#### ざっくり作業内容
##### Tutorial 1:
1. **プロジェクトの作成**  
   - ファイル: コマンド  
   - コマンド: `django-admin startproject mysite`  
   - 内容: Djangoプロジェクトを作成し、初期設定を行う。

2. **アプリの作成**  
   - ファイル: コマンド  
   - コマンド: `python manage.py startapp polls`  
   - 内容: 新しいアプリケーション「polls」を作成。

3. **URL設定の追加**  
   - ファイル: `polls/urls.py`, `mysite/urls.py`  
   - 内容: アプリケーションのURLパターンを定義。

4. **ビューの作成**  
   - ファイル: `polls/views.py`  
   - 内容: シンプルなビュー関数を定義し、`HttpResponse`でテキストを返す。

5. **テンプレートの作成**  
   - ファイル: `polls/templates/polls/index.html`  
   - 内容: テンプレートを作成し、ビューからデータを渡して表示。

6. **データベースの設定とモデルの作成**  
   - ファイル: `polls/models.py`  
   - 内容: `Question` と `Choice` モデルを作成し、フィールドを定義。

7. **マイグレーションの適用**  
   - コマンド: `python manage.py makemigrations`, `python manage.py migrate`  
   - 内容: モデルをデータベースに反映。

8. **Django管理サイトの設定**  
   - ファイル: `polls/admin.py`  
   - 内容: モデルを管理サイトに登録し、管理画面でデータを操作可能にする。

9. **シェルを使ったデータ操作**  
   - コマンド: `python manage.py shell`  
   - 内容: シェルでデータを追加、更新、削除。

##### Tutorial 2: Models and the Admin Site
1. **モデルの作成**  
   - ファイル: `polls/models.py`  
   - 内容: `Question` と `Choice` モデルを作成し、フィールドを定義。

2. **マイグレーションと適用**  
   - コマンド: `python manage.py makemigrations`, `python manage.py migrate`  
   - 内容: モデル変更をデータベースに反映。

3. **Django管理サイトでモデルを管理**  
   - ファイル: `polls/admin.py`  
   - 内容: `Question` モデルを管理サイトに登録し、管理画面で操作可能に。

##### Tutorial 3: Views and Templates
1. **ビューの改良**  
   - ファイル: `polls/views.py`  
   - 内容: 最新の質問リストを表示するために、`index` ビューを更新。

2. **テンプレートの作成**  
   - ファイル: `polls/templates/polls/index.html`  
   - 内容: 動的なコンテンツを表示するためにテンプレートを使用。

3. **404エラーハンドリング**  
   - ファイル: `polls/views.py`  
   - 内容: 存在しない質問IDに対して404エラーを返す処理を追加。

4. **名前付きURLパターンの使用**  
   - ファイル: `polls/urls.py`, `polls/templates/polls/index.html`  
   - 内容: URLパターンに名前を付け、テンプレートで使用。

##### Tutorial 4: Forms and Generic Views
1. **投票フォームの作成**  
   - ファイル: `polls/views.py`, `polls/templates/polls/detail.html`  
   - 内容: 投票用のフォームと処理を追加。

2. **POSTリクエストの処理**  
   - ファイル: `polls/views.py`  
   - 内容: 投票結果を処理し、データベースに反映。

3. **汎用ビューの使用**  
   - ファイル: `polls/views.py`, `polls/urls.py`  
   - 内容: 汎用クラスベースビューにコードをリファクタリング。

##### Tutorial 5: Testing
1. **テストの作成**  
   - ファイル: `polls/tests.py`  
   - 内容: ビューやモデルに対するユニットテストを作成。

2. **`was_published_recently` のテスト**  
   - ファイル: `polls/tests.py`  
   - 内容: `Question` モデルのメソッドをテスト。

3. **自動テストの実行**  
   - コマンド: `python manage.py test polls`  
   - 内容: すべてのテストを実行して、正常に動作することを確認。