Django 5.2 導入手順

# 参考
https://docs.djangoproject.com/en/5.2/

https://www.youtube.com/watch?v=3EzKBFc9_MQ&list=PL4cUxeGkcC9iqfAag3a_BKEX1N43uJutw

# 仮想環境を作成
```
python - m venv フォルダ名
```
# 仮想環境起動
```
.\フォルダ名\Scripts\activate
```
仮想環境の終了
```
deactivate
```
# Djangoのインストール
```
pip install Django
```
バージョンのチェック
```
django-admin --version
```
インストール一覧をチェック
```
pip freeze
```

# Djangoのプロジェクトを作成
仮想環境ディレクトリに移動してから作成→プロジェクト内に移動
```
cd venv
django-admin startproject myproject
cd myproject
```
# Djangoのアプリケーションを追加
DjangoプロジェクトにDjangoアプリケーションを追加
プロジェクトには複数のアプリを含めることができる
機能単位ごとで管理
```
python manage.py startapp myapp
```
これで基本的な環境構築が完了
# サーバーの起動
```
python manage.py runserver
```
# settings.pyにアプリケーション名を追加してリンク
```
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
]
```
正確にクラス名まで書くのが本当は良い
```
INSTALLED_APPS = [
    ...
    'myapp.apps.MyappConfig',
]
```
# settings.py まとめ
Django プロジェクト全体の設定情報をまとめたファイル

アプリケーションの登録（INSTALLED_APPS）
Django や自作のアプリ（例: 認証、ブログ、ショッピングカートなど）をここにリストアップします。これにより、各アプリの機能がプロジェクト全体で利用できるようになります。

データベースの設定（DATABASES）
プロジェクトで利用するデータベース（例: SQLite, PostgreSQL, MySQL など）の接続情報や設定を記述します。
デフォルトはsqlite3だが、必要に応じて変更できる。

ミドルウェア（MIDDLEWARE）
各リクエストとレスポンスの間に動作する共通処理（セキュリティ、セッション管理、認証など）を設定します。

テンプレート設定（TEMPLATES）
HTMLテンプレートの読み込み方法や、テンプレートエンジンの設定、コンテキストプロセッサなどを定義します。

静的ファイルとメディアファイルの設定
CSS、JavaScript、画像などの静的ファイルのパスや URL、ユーザーがアップロードするメディアファイルの配置場所などを指定します。

認証やセッションの設定
ログイン時のリダイレクト先、パスワードリセットの設定、セッションの保存方法などもここで設定します。

その他の各種設定
ログレベル、タイムゾーン、言語、セキュリティ対策（例: CSRF、CORS）など、プロジェクトの基本的な振る舞いを決定するパラメータが含まれます。
# urls.pyをアプリごとに作成する必要がある
ユーザからサーバにリクエストが飛んできたときにURLごとにサーバで何の処理をするのか決定する「目次」
プロジェクトが大きくなると、各アプリごとに urls.py を作成して、メイン URLconf に含める方法が推奨されます。

たとえば、myapp というアプリの URLconf を作成し、include() を使ってメインの URLconf に取り込む方法：
```
# myapp/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),          # /myapp/ にアクセス
    path('detail/<int:pk>/', views.detail, name='detail'),  # 例: /myapp/detail/3/ 
]
```
↓メインの URLconf
```
# myproject/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp.urls')),  # myapp の URL 設定をここに取り込み
    path('', include('myapp.urls')),        # アプリのルートをプロジェクトのルートとして使う場合
]
```

上記のように、urlpatterns というリストに path() 関数を使って URL パターンと対応するビューを列挙します。

path() の引数

第一引数: URL パターン（末尾にスラッシュを含めるのが一般的）。

第二引数: 対応するビュー（関数またはクラスベースビューの場合は .as_view() を呼び出す）。

name: URL 名。テンプレート内やリダイレクトで参照する際に利用します。

DRF の場合：
ViewSet とルーターを使って自動で複数のエンドポイントを生成し、URLconf をシンプルにまとめられる
# models.py
モデルは、例えばユーザー情報、投稿記事、製品の情報など、アプリケーションで扱う各種データの構造を決定します。モデルの定義に基づいて、Djangoは自動的に対応するデータベーステーブルや列を作成・更新できるようになります。
各アプリケーションの models.py ファイルにモデルを定義

モデルの変更は、models.py 内のクラス定義を編集することで行います。たとえば、既存のモデルに新しいフィールドを追加したり、既存のフィールドを変更、削除するなどの操作がこれにあたります。
```
# myapp/models.py
from django.db import models

class Product(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(blank=True)  # blank=True は空文字を許可
    price = models.DecimalField(max_digits=10, decimal_places=2)
    available = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)  # 初回保存時に自動的に日時が設定される
    updated_at = models.DateTimeField(auto_now=True)      # 更新時に自動で日時が更新される

    def __str__(self):
        return self.title
```
各フィールドの説明：
CharField
文字列を保存するためのフィールドです。max_length パラメータで文字数の最大値を指定します。

TextField
長いテキスト（コメントや説明など）を保存するためのフィールドです。blank=True を設定すると、フォームでこのフィールドが空でもエラーになりません。

DecimalField
小数点を含む数値を扱うフィールドです。max_digits は数字全体の桁数、decimal_places は小数点以下の桁数を指定します。金額など、正確な数値計算が必要な場合に使います。

BooleanField
真偽値（True/False）を扱うフィールドです。default=True を設定すると、デフォルト値が True に設定されます。

DateTimeField
日付と時間を保存するフィールドです。

auto_now_add=True は、新規作成時に自動で現在時刻を設定します。

auto_now=True は、保存時に毎回現在時刻に更新します。

str メソッド
モデルのインスタンスを文字列に変換するための特殊メソッドです。管理画面などでオブジェクトが表示されたときに、どのように表示するかを定義します。
# モデル間のリレーションシップ
Django の ORM では、異なるモデル間でリレーションシップを定義できます。代表的なものとして、ForeignKey、ManyToManyField、OneToOneField があります。
# マイグレーションファイルの作成
コマンド python manage.py makemigrations を実行すると、Django がモデルの変更を検知し、それを反映するためのマイグレーションファイル（変更内容を記録したスクリプト）が自動生成
＝定義したモデルに沿ったテーブルがデータベース上に作成される
```
python manage.py makemigrations
```
# マイグレーションファイルをデータベースに適用
生成されたマイグレーションファイルを、python manage.py migrate コマンドでデータベースに適用します。これにより、モデルの変更に合わせたテーブルの追加、変更、削除などがデータベース上で実行
```
python manage.py migrate
```
# views.py
HTTP リクエストを受け取り、そのリクエストに応じた処理（例えば、データベースから情報を取得したり、フォームの入力を検証するなど）を実行し、その結果として HTTP レスポンスを生成して返すためのロジックを記述する場所
レスポンスは、単なる文字列（HTML）や、リダイレクト、ファイルのダウンロードなどさまざまな形がある

関数ビューとして機能する例：
```
from django.shortcuts import render
from .models import Product

def product_list(request):
    products = Product.objects.all()  # データベースから全ての製品データを取得
    return render(request, 'product_list.html', {'products': products})
```
product_list 関数がビューとして機能し、

ユーザーからのリクエストに応じて、Product モデルからデータを取得し、

それを 'product_list.html' というテンプレートに渡してレンダリング（HTML 化）し、

最終的にその HTML コンテンツをレスポンスとして返しています。

クラスベースビューとして機能する例：
```
from django.views.generic import ListView
from .models import Product

class ProductListView(ListView):
    model = Product
    template_name = 'product_list.html'
    context_object_name = 'products'
```
内部で多くの処理を自動的に実装してくれるため、シンプルに一覧ページなどを構築するのに役立ちます。
# 管理者アカウントの作成
Eメールやパスワードを設定しスーパーユーザー（管理者アカウント）を作成
```
python manage.py createsuperuser
```
8000/adminでフォームを表示する。
データを追加・削除・編集など操作できる。

管理フォームを利用可能なユーザーを追加できる。ユーザー権限も変更できる。
グループを作成し、権限をまとめられる。

# admin.py　管理者ダッシュボード
Django の admin.py は、Django の強力な管理画面（Admin Interface）をカスタマイズするためのファイルです。この管理画面は、デフォルトで Django のモデルに対して自動生成され、サイト管理者がデータベースの内容を閲覧・編集できるツールです。admin.py で主に行う作業は、どのモデルを管理画面で扱うかの登録や、表示方法、フィルタや検索などの管理画面のカスタマイズです。

まず、作成した Django アプリには models.py で定義したモデルがあります。これを管理画面で操作できるようにするために、admin.py にモデルを登録します。
```
# myapp/admin.py
from django.contrib import admin
from .models import Product

admin.site.register(Product)
```
これだけで、管理画面に Product モデルが表示され、一覧表示、追加、編集、削除などの基本的な操作ができるようになります。