Django 初期開発

conda を使用して Django プロジェクトを作成するには、以下の手順を行ってください。

新しい Conda 環境を作成: Django 開発用の新しい環境を作成し、Python バージョンを指定します。

```
conda create -n my_django_env python=3.10
```
環境を有効化: 作成した環境を有効化します。


```
conda activate my_django_env
```
Django をインストール: 環境がアクティブな状態で Django をインストールします。


```
conda install -c conda-forge django
```
Django プロジェクトを作成: インストールが完了したら、django-admin コマンドを使用してプロジェクトを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/c949110f-1bd6-66f2-3af0-032657418d07.png)



```
django-admin startproject myproject
```
プロジェクトフォルダに移動: プロジェクトフォルダに移動して、開発を始めます。

```
cd myproject
```
これで、conda 環境内で Django プロジェクトを作成し、開発を始める準備が整いました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/884e5968-43c8-8a6c-e77e-ca8fe0446d7b.png)





## Django プロジェクト内で新しいアプリケーション（accounts）を作成


bash
``` 
conda create -n my_django_env python=3.10
```



python manage.py startapp accounts というコマンドは、Django プロジェクト内で新しいアプリケーション（accounts）を作成するためのものです。

詳しい説明:
python manage.py: Django プロジェクト内で使用する管理用のスクリプトです。Django プロジェクトにおいて、様々なコマンドを実行するために使用します（例: サーバーの起動、マイグレーションの実行、アプリの作成など）。

startapp accounts: startapp は新しいアプリを作成するためのコマンドです。accounts は新しく作成するアプリケーションの名前です。この名前は自由に設定できますが、今回はユーザー管理に関連する機能を実装するので accounts という名前を使用しています。

アプリとは？
Django ではプロジェクトは複数のアプリケーションから構成されます。アプリケーションは特定の機能や目的を持ったまとまりで、プロジェクト内で再利用可能です。例えば、ユーザー管理用のアプリ、ブログ機能用のアプリなどを個別に作成し、プロジェクト内で組み合わせて使用できます。

このコマンドの実行後に行われること:
このコマンドを実行すると、Django プロジェクトのディレクトリ内に accounts という新しいフォルダが作成され、その中に以下のような初期ファイルが自動的に生成されます。

__init__.py：Python パッケージとして認識されるためのファイル。
admin.py：管理画面に関連する設定を行うためのファイル。
apps.py：アプリケーションの構成を定義するファイル。
models.py：データベースのモデルを定義するためのファイル。
tests.py：テストコードを書くためのファイル。
views.py：ビュー関数を記述するためのファイル。
このアプリを作成することで、ユーザー関連の処理（新規登録、ログイン、ログアウトなど）を accounts アプリ内で実装できるようになります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/eaa162c4-892c-cd28-374b-d984051ca7c2.png)


django_1/myproject ディレクトリに Django プロジェクトがあり、その中に accounts というアプリが作成されています。これにより、ユーザー関連の機能を実装する準備が整っています。ここからの説明では、accounts アプリで新規ユーザー登録とログインページを作成するために行うべき具体的なステップを、さらにわかりやすく説明します。


## accounts アプリで新規ユーザー登録とログインページを作成



1. accounts アプリの役割

accounts アプリは、ユーザー関連の機能（新規登録、ログイン、ログアウトなど）を担当します。各アプリは独立して機能を持ち、プロジェクト全体で利用できる構造になっています。


# ここから実施予定

2. 次に行うべきこと

a. accounts/views.py の編集

ビューは、ユーザーがリクエストを送ったときに返されるページや処理を定義します。

ここでは、新規登録ページとログインページを表示・処理するビューを作成します。

コードの説明:

register 関数: ユーザーが新規登録するための処理を担当。
user_login 関数: ユーザーがログインするための処理を担当。


以下は views.py に追加するコードです。
```
from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('home')  # ホームページにリダイレクト。必要に応じて変更。
    else:
        form = UserCreationForm()
    return render(request, 'accounts/register.html', {'form': form})

def user_login(request):
    if request.method == 'POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return redirect('home')  # ホームページにリダイレクト。必要に応じて変更。
    else:
        form = AuthenticationForm()
    return render(request, 'accounts/login.html', {'form': form})
```
    


b. テンプレートファイルの作成
テンプレートは HTML ページのようなものです。Django では、
テンプレート内に Python コードを埋め込んで動的なページを作成できます。

プロジェクト内に templates/accounts/ フォルダを作成してください。
templates/accounts/ フォルダの中に、register.html と login.html ファイルを作成します。



register.html の例:

html
```
<h2>Register</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Register</button>
</form>
```

login.html の例:

html
```
<h2>Login</h2>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Login</button>
</form>
```

c. URL ルーティングの設定


Django の URL ルーティングは、特定の URL にアクセスしたときにどのビュー関数を呼び出すかを決定する役割を持っています。これは、ユーザーがウェブサイトで異なるページにアクセスできるようにするための仕組みです。初心者の方でも理解しやすいように、具体的な説明をします。

URL ルーティングの基本

Django の URL ルーティングは、URL パターンをビュー関数と結び付ける設定です。例えば、ユーザーが /accounts/register/ にアクセスしたときに register ビュー関数を呼び出して登録ページを表示するように設定します。


accounts アプリ内に urls.py を作成
アプリケーションごとに urls.py を作成し、そのアプリのビュー関数と URL を結びつけます。



accounts/urls.py を作成し、ルーティングを定義します。

```
# 必要なモジュールをインポート
from django.urls import path  # path 関数をインポート
from .views import register, user_login  # 自分のアプリ内のビュー関数をインポート

# URLパターンのリストを定義
urlpatterns = [
    path('register/', register, name='register'),  # /accounts/register/ にアクセスすると register 関数を呼び出す
    path('login/', user_login, name='login'),  # /accounts/login/ にアクセスすると user_login 関数を呼び出す
]

```

path 関数の説明:
path('register/', register, name='register') は、/accounts/register/ にアクセスしたときに register ビュー関数を呼び出す設定です。
name='register' は、この URL パターンに名前を付けています。これにより、テンプレート内でこの URL を名前で参照できます。

プロジェクト全体でのルーティング設定

プロジェクトの urls.py ファイルで、accounts アプリの urls.py をインクルードして、プロジェクト全体で認識されるようにします。

myproject/urls.py ファイルを開いてください。
accounts.urls をインクルードするために、以下のようにコードを編集します。
myproject/urls.py の内容:


python
```
from django.contrib import admin  # Django の管理サイト用
from django.urls import path, include  # URL 設定用の関数をインポート

# URLパターンのリスト
urlpatterns = [
    path('admin/', admin.site.urls),  # 管理画面への URL 設定
    path('accounts/', include('accounts.urls')),  # /accounts/ 以下の URL は accounts/urls.py に委任
]
```

include 関数の説明:
include('accounts.urls') は、accounts アプリ内の urls.py をプロジェクトの urls.py にインクルードします。これにより、/accounts/ で始まる URL パターンはすべて accounts/urls.py に委ねられます。


include 関数は、Django の URL ルーティングでとても重要な役割を果たしますが、最初は少しわかりづらいかもしれません。具体的に、include 関数がどのように動作するかを説明します。



include の基本的な役割

include 関数は、Django の URL ルーティングにおいて「別の URL 設定ファイルを読み込む」という役割を持っています。プロジェクトの中にある複数のアプリケーションそれぞれに独自の urls.py を持たせ、その URL 設定をプロジェクト全体に追加するために使います。


これにより、Django プロジェクト全体で URL のルーティングを管理しやすくし、各アプリごとに URL のパターンを分けて記述できます。



include の具体例

例えば、accounts というアプリにユーザー登録やログインのページを持つ場合、accounts アプリ内にある urls.py にそれらの URL 設定をまとめて記述できます。そして、プロジェクト全体の URL ルーティングを管理する myproject/urls.py で accounts の URL 設定を「インクルード（読み込む）」することで、accounts 内の URL パターンをプロジェクト全体に適用します。





render を使ったビュー関数の説明
Django の render 関数は、指定されたテンプレートを HTML ページとして表示します。テンプレート内で表示したいデータも一緒に渡すことができます。

register ビュー関数での render の使い方:

```
def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('home')  # ユーザーが登録後にリダイレクトするページを指定
    else:
        form = UserCreationForm()  # フォームを空の状態で表示
    return render(request, 'accounts/register.html', {'form': form})  # 'register.html' をレンダリングして表示

```

render(request, 'accounts/register.html', {'form': form}) の説明:
request: クライアントからの HTTP リクエスト。
'accounts/register.html': 表示するテンプレートのパス。
{'form': form}: テンプレートに渡すコンテキスト（ここではフォーム）。

user_login ビュー関数での render の使い方:

```
def user_login(request):
    if request.method == 'POST':
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return redirect('home')
    else:
        form = AuthenticationForm()  # フォームを空の状態で表示
    return render(request, 'accounts/login.html', {'form': form})  # 'login.html' をレンダリングして表示

```