Djangoアプリにユーザー登録のためのサインアップ機能を実装してみましょう。Djangoが予め用意してくれている汎用ビューやUserモデルを使えば、簡単にサインアップ機能を実装することができます。
今回は独自のモデルは作らずに、最も簡単なユーザー名とパスワードだけでサインアップする機能を実装してみましょう。
目次
ユーザー管理アプリの作成・登録
まずはユーザー管理用のアプリケーションを作成します。
Windows PowerShell で django-tutorial へ移動し、次のコマンドでアプリケーション用のファイルを自動生成します。
python manage.py startapp accounts
このアプリをDjangoプロジェクトに登録しておきましょう。
config/settings.py に次のように記述します。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'hello.apps.HelloConfig',
'bbs.apps.BbsConfig',
'accounts.apps.AccountsConfig', # 作成したアプリを追加
]
これで先ほど作成した accounts アプリケーションをDjangoが認識できるようになりました。
ルーティングの設定
accounts アプリのルーティングを設定します。
/config/urls.py に次のように記述します。
from django.contrib import admin
from django.urls import path, include
from django.views.generic import RedirectView
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', include('hello.urls')),
path('bbs/', include('bbs.urls')),
path('accounts/', include('accounts.urls')), # accounts/以下のルーティングはaccounts.urls.pyに任せる
path('accounts/', include('django.contrib.auth.urls')),
path('', RedirectView.as_view(url='/bbs/')),
]
前回のログイン機能のルーティングも accounts/ だったので、このルートが2つありますが、こういう場合Djangoは上から順番に調べます。
今回の場合、まず accounts.urls.py に一致するパスがないか探して、一致するものがなければ後述されている django.contrib.auth.urls を探してくれます。
accounts/以下のルーティングも設定しましょう。
先ほど生成した accounts ディレクトリの中に urls.py というファイルを作成し、次のように記述します。
from django.urls import path
from . import views
app_name = 'accounts'
urlpatterns = [
path('signup/', views.SignUpView.as_view(), name='signup'), # ユーザー登録を呼び出すビュー
]
サインアップ画面のビューとして SignUpView というクラスからビュー関数化したものを指定しました。
ビューの作成
先ほど指定した SignUpView クラスを作成しましょう。
/accounts/views.py に次のように記述します。
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views import generic
# 汎用ビューのCreateViewを継承したSignUpViewクラスを作成
class SignUpView(generic.CreateView):
form_class = UserCreationForm
success_url = reverse_lazy('login')
template_name = 'accounts/signup.html'
ユーザー情報を登録するために汎用ビューの CreateViewクラスを継承して SignUpViewクラスを作成。
その中で UserCreationForm を呼び出し、テンプレートとして accounts/signup.html を呼び出します。
そしてサインアップ成功時にはログインページのURL(/login/)にリダイレクトします。
テンプレートを作成
次は呼び出すテンプレートを作成します。
templatesディレクトリの中にaccountsディレクトリを作成し、その中にsignup.htmlという名前でファイルを作成します。

signup.html に次のように記述します。
{% extends 'base.html' %}
{% block content %}
<h1>Sign up</h1>
<section>
<form method='post'>
{% csrf_token %}
{{ form.as_p }}<!-- 汎用ビューで用意した項目をフォームとして表示 -->
<button type='submit'>サインアップ</button>
</form>
</section>
{% endblock %}
共通テンプレートですが、ログイン画面のものと共通にしてしまいましょう。
アプリケーションをまたいだ、プロジェクト全体の共通テンプレートはtemplatesディレクトリの直下に配置します。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Djangoのユーザー管理機能を使ってみよう!</title>
<style>h1 {color: #0000ff}</style>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
このテンプレートを呼び出すときは次のように区切り文字を入れずに指定します。
{% extends 'base.html' %}
後略
ログイン画面(login.html)とログアウト画面(logged_out)のテンプレートも、こちらの共通テンプレートを呼び出すよう修正しておきましょう。
サインアップ画面へのリンクを配置
サインアップ画面へのリンクを配置しておきましょう。
login.html に次のように追記します。
{% extends 'base.html' %}
{% block content %}
<h1>Djangoで作るログイン機能</h1>
{% if user.is_authenticated %}<!-- ユーザーを認証していたら -->
<p>{{ user }} でログインしています</p>
<button onclick='location.href="{% url "logout" %}"'>ログアウト</button>
{% else %}
<section>
<!-- ログイン用フォーム -->
<form action='{% url "login" %}' method='post'>
{% csrf_token %}
<input type='hidden' name='next' value='{{ next }}'/><!-- csrf_token用の隠し項目 -->
{{ form.as_p }}<!-- ログイン用の項目 -->
<button type='submit'>ログイン</button>
</form>
<button onclick='location.href="{% url "accounts:signup" %}"'>新規登録</button>
</section>
{% endif %}
{% endblock %}
ユーザーがログインしていない時に、ログインフォームのほかに「新規登録」ボタンも配置しています。
これならログイン画面にアクセスしたユーザーがまだユーザー登録をしていなかったとしても、迷わずサインアップ画面に進むことができます。
動作確認
それでは動作確認です。
Djangoコマンドを使ってサーバーを起動し、ブラウザで確認してみましょう。
http://127.0.0.1:8000/accounts/login/ にアクセスします。

ログインボタンの下に「新規登録」ボタンが表示されています。クリックしてみましょう。

サインアップ画面が表示されました。
実際にユーザー登録してみましょう。必要項目を入力して「サインアップ」ボタンをクリックします。
サインアップが完了し、ログイン画面にリダイレクトされました。
先ほど登録したユーザー名とパスワードでログインしてみましょう。

ログインが完了し、投稿一覧ページにリダイレクトされました。
登録されたユーザーデータを確認してみましょう。
Djangoの管理サイト(http://127.0.0.1:8000/admin/)にアクセスします。

管理者権限のあるスーパーユーザーでログイン。

「ユーザー」をクリックしてデータベースを確認してみましょう。

先ほど登録した「onishi」というユーザーが保存されています。
このようにサインアップ機能で登録したユーザー情報はDjangoのUserモデルに対応するテーブルに保存されます。







