Userモデルについて
今回のチュートリアルでは、ユーザー登録機能やログイン機能を実装します。
ログイン機能があれば、アクセスしてきたユーザーを識別することができ、各ユーザーに合わせたページ表示などができるようになります。例えば、「アクセスしてきたユーザーが未ログイン状態の場合はログインページにリダイレクトさせる」、「ログイン済みの場合はマイページを表示させる」、といった感じです。
ユーザー認証機能は、Webサービスでは頻繁に使われる機能であるため、Djangoでは簡単に実装できるようにユーザー認証に関する様々な機能がデフォルトで提供されています。
これまでのチュートリアルで扱ったBlogモデルやMemoモデルのように、普通、モデルは自分で要件を定義していく必要があります。しかし、DjangoではデフォルトでUserモデルを提供しています。このUserモデルを活用することで、簡単に認証機能が作れるのです。
Userモデルにはいくつかフィールドが定義されており、「username(ユーザー名)」、「first_name(名)」、「last_name(姓)」、「email(メールアドレス)」、「password(パスワード)」「date_joined(登録日)」、「last_login(最終ログイン日)」などのフィールドがあります。
実は、みなさんはすでにこのUserモデルを使っています。プロジェクト立ち上げ時に、python manage.py createsuperuser
コマンドで、管理者アカウントを作成しましたが、この管理者アカウントはUserモデルをベースに作られています。(アカウント作成時にusername、email、passwordを入力しましたよね。)
Userモデルについては、最初からAdminページで表示されるようになっていますので、実際に確認してみましょう。自分のアカウントをクリックしてみると、いろんなフィールドがあることがわかると思います。
Userモデルがどのような構成をしているのかを、もっと具体的に知りたい場合はソースコードを確認します。DjangoのソースコードはGitHub上に公開されています。
Userモデルは、django.contrib.auth.models
のファイルで定義されていますので、このページにいくと確認できます。
Userクラスの定義は、ここです。Userクラス自体にはほぼ何も書いてありませんが、UserクラスはAbstractUserを継承しているので、すぐ上にあるAbstractUserクラスをみると概要がわかります。
Userモデルを使ってみよう
まずは、Userモデルをshellで使ってみましょう。インポートすれば、普通のモデルと同様に扱うことができます。上でも説明したように、Userモデルはdjango.contrib.auth.models
で定義されていますので、最初にここからインポートします。
~/PhotoService
$ python manage.py shell
# Userモデルをインポート
>>> from django.contrib.auth.models import User
# 全てのUserインスタンスを表示
>>> User.objects.all()
# usernameを指定してインスタンスを取得
>>> user1 = User.objects.get(username='Jobs')
# user1のメールアドレスを表示
>>> user1.email
'jobs@sample.com'
# user1の登録日を表示
>>> user1.date_joined
datetime.datetime(2019, 2, 23, 8, 4, 8, tzinfo=<UTC>)
# 取得したUserがスーパーユーザー権限を持っているかの確認(True, False)
>>> user1.is_superuser
True
ユーザーページを作る
ここまでできたら、最後にユーザーページを作りましょう。ユーザーページの完成イメージは下のようになります。
URLの中の数字が、ユーザーのIDに対応しています。このページでは対応するユーザーの、名前、投稿件数、投稿した写真を表示させるようにします。
ここではとりあえず名前だけ表示させてみましょう。
~/PhotoService/app/urls.py
from django.urls import path
from . import views
app_name = 'app'
urlpatterns = [
path('', views.index, name='index'),
path('users/<int:pk>/', views.users_detail, name='users_detail'), ←追加
]
views.pyでも、Userのインポート文を書くことを忘れないようにしましょう。
~/PhotoService/app/views.py
from django.shortcuts import get_object_or_404, render
from django.contrib.auth.models import User # 追加
# 追加
def users_detail(request, pk):
user = get_object_or_404(User, pk=pk)
return render(request, 'app/users_detail.html', {'user': user})
これまでに説明したように、Userオブジェクトは様々な属性を持っていますので、HTMLファイルでもこの属性にアクセスすることでデータを表示させることができます。下例では、user.username
とすることで、ユーザー名を表示しています。
~/PhotoService/app/templates/app/users_detail.html
{% extends 'app/base.html' %}
{% block content %}
<h2 class="user-name">@{{ user.username }}</h2>
{% endblock %}
Userオブジェクトが持つ属性の中には、Boolean型(TrueかFalse)を返すものもあるので、これを使えば必要に応じて条件分岐ができます。
例えば、is_superuser
は、そのユーザーがスーパーユーザーかどうかを示します。
~/PhotoService/app/templates/app/users_detail.html
{% extends 'app/base.html' %}
{% block content %}
<h2 class="user-name">@{{ user.username }}</h2>
{{ user.is_superuser }} <!-- 管理者の場合はTrue -->
<!-- ユーザーの持つ権限によって表示を切り替え -->
{% if user.is_superuser %}
<p>管理者</p>
{% else %}
<p>一般ユーザー</p>
{% endif %}
{% endblock %}
ユーザーがどんな属性を持っているかは、公式チュートリアルにも一覧としてまとまっています。
Userモデルに関する説明は一旦ここで終了です。