前のパートに戻る 完了して次のパートへ  

  1-1 ユーザーモデルを定義しよう

まずはユーザー認証を設定していきます。 この章からDjangoについて触れていきますがもしあなたが最初に設計思想が知りたければ、設計思想 | Django ドキュメント | Djangoを読んでみるといいでしょう。

またこの章で取り上げるDjangoの認証についてより詳細なことが知りたい場合は Djangoの認証システムを使用する | Django ドキュメント | Djangoを参照してみてください。

ではこの章で行うことを紹介します。

この章で学べること


- ユーザー登録機能の作成
- ログイン機能の作成
- ログアウト機能の作成
- アイコン編集機能の作成

Djangoの1つのプロジェクトは複数のアプリによって構成されます。ここで指すアプリは一つのWebサービスの機能ごとに分割したものです。

例えば今回はユーザーを管理するアプリと投稿を管理するアプリを作ります。その2つが連動することによってtechpitgramという投稿サービスが出来上がっていきます。


ユーザー認証機能を作ろう

はじめにユーザー認証から作っていきましょう。

まずは認証に使うアプリを追加していきます。アプリの追加にはDjangoのコマンドを使います。また、ここからはpipenvの環境内で実行したいのでpipenv runコマンドを使っています。

$ pipenv run python manage.py startapp accounts

アプリを作成したらtechpitgram/techpitgram/settings.pyINSTALLED_APPSに追加します。 INSTALLED_APPSはDjangoで使うアプリを宣言するところです。生成時点ではDjangoに必要なアプリが格納されています。自分が作ったアプリもここに追記することによって使えるようになります。

また、他の方が作ったアプリも追加することが出来ます。

デフォルトで有効になっているものは以下のようなものになっています。

また、ユーザーの認証使うモデルはaccounts/models.pyのUserクラスを使うように設定しています。 最後に、アップロードした画像の保存先をmediaディレクトリに指定しています。 プロジェクト直下にmediaディレクトリを作成しておきます。

settings.pyの最後に以下のように追加してみましょう。

修正: techpitgram/techpitgram/settings.py

︙
(略)
︙
INSTALLED_APPS = [
    'accounts.apps.AccountsConfig',   # アカウント管理のアプリを追加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
︙
(略)
︙

AUTH_USER_MODEL = 'accounts.User' # アカウント管理で使うモデル(後述)を指定する行を追加
# アップロードした画像の保存先
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

このタイミングでのファイル構造は以下のようになります。

.
├── Pipfile
├── Pipfile.lock
├── accounts  # 新しく追加される
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── media
│   └── image
│       └── # ここに画像が貯まる
└── techpitgram
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

ユーザーモデルを定義する


モデルはWebアプリケーションのデータの構造を定義して操作しやすくするために存在しているものです。

Djangoではモデルにアプリで使うデータを定義してそのファイルを使ってデータを入れたり、引き出したりします。 さらにDjangoでは標準でメールアドレスや表示名が含まれているユーザーモデルが用意されていますが、標準ではアイコンに関する設定はありません。今回はDjangoの標準機能に付け足す形で実装していきます。

参考: モデル | Django ドキュメント | Django

techpitgram/accounts/models.pyを編集します。

修正: techpitgram/accounts/models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
​​from django.urls import reverse

# AbstractUser: Djangoが用意しているUserモデルを継承する
class User(AbstractUser):
    # アイコンを画像を保存できるImageFieldとして定義する
    icon = models.ImageField(upload_to="image/", blank=True, null=True)

    # 作成を成功したら'ginstagram:profile'と定義されているURLに飛ぶ
    def get_absolute_url(self):
        return reverse(
            'ginstagram:profile', kwargs={'username': self.username})

AbstractUserはDjandoで用意しているユーザーモデルクラスになります。

icon = models.ImageField(upload_to="image/", blank=False, null=False)

このコードは追加でiconカラムを定義しています。画像を扱うImageFieldというフィールド型を使っています。 upload_toは画像のアップロード先を定義しています。

blankはフォームから投稿されるときに入力必須であることを示すオプションです。 nullはDB挿入時にnullを許容するかのオプションです。

もし他にどんなフィールドタイプがあるか興味ある方は公式ドキュメント モデルフィールドリファレンス | Django ドキュメント | Djangoを参照してみてください。

# 作成を成功したら'ginstagram:profile'と定義されているURLに飛ぶ
def get_absolute_url(self):
    return reverse(
        'ginstagram:profile', kwargs={'username': self.username})

ここではユーザー作成を行ったら新しく作ったユーザーのユーザーページに飛ぶように実装しています。

reverseはアプリ名とurls.pyで指定nameからURLを生成してくれる関数です。kwargsはその生成時使われるパラーメターのことを指しています。今回は新しく作成したユーザーにリダイレクトさせたいのでユーザー名を引き渡しています。

モデルをデータベースに反映させる

モデルに定義したものはマイグレーションコマンドを発行することによってデータベースに反映させます。さっそくやってみましょう。

# マイグレーションファイルを生成する
$ pipenv run python manage.py makemigrations

Migrations for 'accounts':
  accounts/migrations/0001_initial.py
    - Create model User

# マイグレーションファイルを適用する
$ pipenv run python manage.py migrate

Operations to perform:
  Apply all migrations: accounts, admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0001_initial... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying accounts.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying sessions.0001_initial... OK

これでデータベースへの反映までおわりました。

次にログイン画面を作っていきましょう。

議論

4 質問

このコースの評価は?