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
'[email protected]'
# 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モデルに関する説明は一旦ここで終了です。

< PREV NEXT >
SHARE ! Tweet