Python Djangoを使ってみる その3（自分用）

今回はDjangoの<strong> modedls.py </strong>について考える
⇒ <a href="https://https://qiita.com/mm02060116/items/385f26a6539eed9de97b">前回の内容</a>

1.ディレクトリ構造を確認
-
myappディレクトリに存在する、現時点で使い方のよくわからないファイルである。
```
myappディレクトリ

myapp/
│
├── templates/
│   └── myapp/
│       └── index.html  # HTMLファイル
└── migrate/
│       └──  __init__.py
├── __init__.py
├── admin.py
├── apps.py
├── models.py    ← 今回のテーマ
├── tests.py
├── views.py
```

2.モデルとは（GPT調べ）
-
Djangoのモデルは、コンピュータにものの情報を覚えさせるための設計図みたいなもの。
例えば、おもちゃのリストを作りたいとする。
リストには、おもちゃの名前や色、値段などが書かれている。
Djangoのモデルは、そういう情報をコンピュータの中で覚えるために存在する。

3.modelsを活用した本リストを考える
-
modelsを使ってデータベースから本の情報を取得し、それをテンプレートで表示する方法を考える。
<strong>3.1 book_list.htmlを追加する</strong>
本のデータを表示するHTMLファイルとしてbook_list.htmlをtempletesに追加しておく。
```
myappディレクトリ

myapp/
│
├── templates/
│   └── myapp/
│       └── index.html  
│       ├── book_list.html  ←　手動追加したHTMLファイル
└── migrate/
│       └──  __init__.py
├── __init__.py
├── admin.py
├── apps.py
├── models.py    ← 今回のテーマ
├── tests.py
├── views.py
```
<strong>3.2モデルを作成</strong>
まず、本のデータを保存するためのモデルを作成する。
```python:myapp/models.py
from django.db import models

class Book(models.Model):  # Book（本）という名前のモデルを作る
    name = models.CharField(max_length=100)  # 本の名前
    author = models.CharField(max_length=100)  # 著者の名前
    pages = models.IntegerField()  # ページ数
```
<strong>3.3 マイグレーションを実行</strong>
データベースにこのモデルのテーブルを作成するためにマイグレーションを実行。
次のコマンドを実行し、マイグレーションファイルを作成する
（ちなみにマイグレーション（migration）の和訳は <strong >移転・移動 </strong>である。）
```
python manage.py makemigrations
```
次のコマンドでマイグレーションを実行すると、DjangoのデータベースにBookモデル用のテーブルが作成される。
```
python manage.py migrate
```
<strong>3.4 ディレクトリ構造を確認</strong>
```
myapp/
│
├── templates/
│   └── myapp/
│       └── index.html  
│       ├── book_list.html  ←　手動追加したHTMLファイル
└── migrations/
│       └── __init__.py
│       ├── 0001_initial.py  ← マイグレーションにより生成されたファイル
├── __init__.py
├── admin.py
├── apps.py
├── models.py    ← 今回のテーマ
├── tests.py
├── views.py
```
マイグレーションにより、migrationsフォルダに謎のファイルが生成された。

4.管理画面で本を追加
-
Djangoの管理画面を使って簡単にデータを追加することができます。

<strong>4.1 管理画面で Book モデルを登録</strong>
myapp/admin.py に次のコードを追加します。

```python:myapp/admin.py
from django.contrib import admin
from .models import Book

# Bookモデルを管理画面で操作できるように登録
admin.site.register(Book)
```
<strong>4.2 スーパーユーザー（管理者アカウント）を作成</strong>
管理画面にアクセスするために、スーパーユーザーを作成する。
```
python manage.py createsuperuser
```
ユーザー名、メールアドレス、パスワードを設定する。

<strong>4.3 開発用サーバーを起動</strong>
<a href="http://127.0.0.1:8000/admin/">http://127.0.0.1:8000/admin/</a>にアクセスし、先程のログイン情報でログインする。
管理画面から Book を選択して、いくつか本を追加してみる。
```
python manage.py runsever
```

5.ビューでデータを表示する
-
<strong>5.1 views.py の編集</strong>
次に、views.py でデータベースから本のリストを取得し、テンプレートに渡す。
```python:myapp/views.py
from django.shortcuts import render
from .models import Book  # Bookモデルをインポート

def book_list_view(request):
    books = Book.objects.all()  # データベースからすべての本を取得
    return render(request, 'myapp/book_list.html', {'books': books})
```
<strong>5.2 テンプレート の編集</strong>
book_list.html は、先ほどのテンプレートと同じ形式で、モデルから取得したデータを繰り返し表示します。
```html:myapp/book_list.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>本のリスト</title>
</head>
<body>
    <h1>本のリスト</h1>
    
    <ul>
        {% for book in books %}
            <li>
                <strong>タイトル:</strong> {{ book.name }}<br>
                <strong>著者:</strong> {{ book.author }}<br>
                <strong>ページ数:</strong> {{ book.pages }} ページ
            </li>
        {% empty %}
            <li>本が見つかりませんでした。</li>
        {% endfor %}
    </ul>
</body>
</html>
```

4.ルーティング設定
-
<strong> urls.py </strong> に新しいビューを紐付けする。
```python:myproject/urls.py
from django.contrib import admin
from django.urls import path
from sample_app.views import welcome_view , clicked_view , book_list_view # ビューをインポート

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', welcome_view),  # ルートURLでようこそを表示
    path('clicked/', clicked_view),  # ボタンがクリックされたときのURL
    path('books/', book_list_view),  # /books/ で本のリストを表示
]
```
5.開発用サーバーを起動
-
<a href="http://127.0.0.1:8000/books/">http://127.0.0.1:8000/books/</a>にアクセスする。
管理画面から追加した本の情報が表示されたらOK！
```
python manage.py runsever
```
5.追記予定
-