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 コマンドを使用してプロジェクトを作成します。
django-admin startproject myproject
プロジェクトフォルダに移動: プロジェクトフォルダに移動して、開発を始めます。
cd myproject
これで、conda 環境内で Django プロジェクトを作成し、開発を始める準備が整いました。
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 アプリ内で実装できるようになります。
django_1/myproject ディレクトリに Django プロジェクトがあり、その中に accounts というアプリが作成されています。これにより、ユーザー関連の機能を実装する準備が整っています。ここからの説明では、accounts アプリで新規ユーザー登録とログインページを作成するために行うべき具体的なステップを、さらにわかりやすく説明します。
accounts アプリで新規ユーザー登録とログインページを作成
- accounts アプリの役割
accounts アプリは、ユーザー関連の機能(新規登録、ログイン、ログアウトなど)を担当します。各アプリは独立して機能を持ち、プロジェクト全体で利用できる構造になっています。
ここから実施予定
- 次に行うべきこと
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' をレンダリングして表示