Djangoを使うのに必要なPythonとDjangoの知識

# 関数
```
def 関数名(引数1, 引数2, ...):
    """この関数が何をするかを記述するドキュメント文字列"""
    # 実行したい処理
    結果 = 引数1 + 引数2   # 例として処理を記述
    return 結果
```

```
def add_numbers(a, b):
    return a + b

print(add_numbers(3, 5))  # 8 が出力される
```

viewsで使う例：
```
# myapp/views.py
from django.http import HttpResponse

def hello_view(request):
    return HttpResponse("Hello, Django!")
```
# HttpRespons
HttpResponse は、サーバー側で HTTP レスポンス（クライアントに返すレスポンス）を構築するためのオブジェクトです。これにより、ビュー関数やクラスベースビューから、HTML やテキスト、バイナリデータなど、さまざまな形式のレスポンスをクライアントに返すことができます。 ＝　内容（HTML、テキスト、その他データ）を設定して返す
```
HttpResponse のコンストラクタにレスポンスとして返すコンテンツ（通常は文字列）を渡すことで、その内容がクライアント（ブラウザなど）に表示されます。
from django.http import HttpResponse

def my_view(request):
    return HttpResponse("Hello, world!")
```
```
ステータスコードの指定
デフォルトでは 200 (OK) が使われますが、必要に応じてステータスコードを変更できます。
return HttpResponse("Not found", status=404)
```
```
ヘッダーの追加
レスポンスヘッダーをカスタマイズして、コンテンツタイプやキャッシュの設定、クッキーの設定などを行うことができます。
response = HttpResponse("Hello, world!")
response["Content-Type"] = "text/plain"
return response
```
# デコレーター
デコレーターを使って関数の動作を拡張する
たとえば、ユーザー認証が必要なビューに対して @login_required デコレーターをつけることで、ログインしていない場合にログインページへリダイレクトする処理を自動化できます。
```
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse

@login_required
def secure_view(request):
    return HttpResponse("このページはログイン済みユーザーのみアクセス可能")
```

DRF の @api_view デコレーターを使った関数ベースのビューは、HTTP メソッドごとに処理を記述できます。
```
from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(['GET'])
def sample_api(request):
    data = {"message": "Hello, API!"}
    return Response(data)
```
# str メソッド
Python では、名前が前後に 2 つのアンダースコア（__）で囲まれているメソッドや属性を「マジックメソッド」あるいは「ダンダー（dunder）メソッド」と呼びます。これらは、Python の内部処理やオブジェクトの特定の振る舞いをカスタマイズするために用意された特殊なメソッドです。

__str__ は、オブジェクトの「人間が読んでわかりやすい文字列表現」を返すための特殊なメソッドです。たとえば、Django のモデルクラスでこのメソッドを定義すると、管理画面やシェルでオブジェクトが文字列として表示されるときに呼び出されます。　＝　必要な情報を文字列で表現する

クラス内に __str__ を定義して、オブジェクトの情報をわかりやすく返す文字列を書くことで、そのオブジェクトの表現方法をカスタマイズします。
```
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"{self.name} ({self.age}歳)"

p = Person("Alice", 30)
print(p)  # 結果: Alice (30歳)
```
# ダンダーメソッド
クラスやオブジェクトに特定の標準機能を実装するために用意されています。
```
__init__: コンストラクタ。オブジェクト生成時に呼ばれます。

__str__: 人間向けの文字列表現を返す。

__repr__: 開発者向けの文字列表現を返す。

__len__: オブジェクトの長さを返す（len(obj) が呼ばれると実行される）。

__getitem__, __setitem__ など：オブジェクトを配列のようにインデックス参照するために使われます。
```
これらの概念は Python のオブジェクト指向プログラミングにおいて非常に重要であり、Django や DRF のコードを理解する上でも必須の知識となります。

# {}
{} を使って辞書を作成したり、f-string 内で変数を埋め込んだりと、さまざまな用途で {} が使われます。
```
f-string 内での変数の埋め込み
name = "Alice"
print(f"Hello, {name}!")  # ここで {name} に "Alice" が入る
```
# render関数
ビュー関数内でテンプレートを読み込み、そのテンプレートに与えたコンテキスト（データ）を組み合わせた HTML を生成し、HttpResponse オブジェクトとして返すためのヘルパー関数です。これにより、ビューでテンプレートを手動でロードしてレンダリングし、レスポンスを作成する手間を大幅に省くことができます。
＝　テンプレートファイルを読み込み、指定されたコンテキストデータを適用して HTML を生成し、HttpResponse を返しています。
```
# myapp/views.py
from django.shortcuts import render

def hello_view(request):
    context = {'message': 'Hello, Django!'}
    return render(request, 'hello.html', context)
```
第1引数：request オブジェクト（ビューに渡されるリクエスト情報）

第2引数：'hello.html' テンプレートファイルの名前。通常、テンプレートディレクトリ内に配置されたファイルを指定します。

第3引数：テンプレートに渡すコンテキスト（辞書形式のデータ）。ここでは、キー 'message' に "Hello, Django!" という値を設定しています。

```
<!-- hello.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Hello Page</title>
</head>
<body>
    <h1>{{ message }}</h1>
</body>
</html>
```
実際に hello_view 関数が呼ばれると、Django はテンプレートエンジンを使って hello.html をレンダリングし、{{ message }} を "Hello, Django!" に置き換えた最終的な HTML を含む HttpResponse を返します。
# コメントアウト
単一行コメント: # を使う
```
# これはコメントです。実行されません。
print("Hello, world!")  # ここもコメントになります。
```
複数行コメント: トリプルクォート（''' または """）を使う（ただしドキュメントストリングとしての性質がある点に注意）
```
"""
この部分は複数行のコメントのように見えますが、
実際は文字列リテラルです。変数に割り当てないと無視されます。
"""

'''
こちらも同じく、複数行コメントのように使うことができます。
実際には文字列として存在しますが、何も代入されなければ無視されます。
'''
```

# pythonインタープリターの起動コマンド
```
python
```
# iPython
```
iptyhon
```
iPython は、Python のコードを対話的に実行するためのシェルで、標準の Python シェルよりも多くの補助機能（オートコンプリート、シンタックスハイライト、マジックコマンド、履歴管理など）を提供します。プロジェクトの開発中、特にデバッグやデータ解析、実験的なコード実行時に非常に役立つツールです。

利用例：
```
In [1]: def greet(name):
   ...:     return f"Hello, {name}!"
   ...:
In [2]: greet("Alice")
Out[2]: 'Hello, Alice!'

```