Menu
CoddyTech

ノートには所有者がいる

CoddyのDjangoジャーニー「ユーザーとアカウント」セクションの一部。レッスン 8/16。

ログインしているユーザーは全員、1つのメモの山を共有します。各メモを書いた人を区別できるように、誰が書いたのかを記録する必要があります。書籍とその著者を結び付ける場合と同じように、ForeignKeyを使います。

ユーザーに紐付けるには、Userをインポートしないでください。ForeignKeyには、ユーザーモデルを指定する設定であるsettings.AUTH_USER_MODEL(from django.conf import settingsの後)を指定します。ここでは"auth.User"です。こうすることで、独自のユーザーモデルを持つプロジェクトでもコードをそのまま使えます。

メモを書いた人は、フォームのフィールドにしてはいけません。ユーザーが選べると、別の人になりすまして書けてしまうからです。ビューで値を設定します。Formsのセクションと同様に、form.save(commit=False)は保存せずにオブジェクトを作成するため、ビューでフォームにないフィールドを設定できます。

order = form.save(commit=False)
order.total = order.quantity * order.unit_price
order.save()

「Run」を実行すると、新しいフィールドのためにmakemigrationsとmigrateが実行されます。

challenge icon

チャレンジ

中級

各メモに所有者を設定します。

  1. notes/models.pyで、Noteにownerフィールドを追加します。これはsettings.AUTH_USER_MODELへのForeignKeyで、on_delete=models.CASCADEとrelated_name="notes"を指定します。django.confからsettingsをインポートします。
  2. note_create(views.py)で、note = form.save()を置き換えます。保存せずにメモを作成し、ログイン中のユーザーを所有者に設定してから保存します。

adaとしてメモを書き、Dataタブを開きます。所有者は1です。

自分で試してみよう

from django.db import models


class Note(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField(blank=True)
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-created"]

    def __str__(self):
        return self.title

ユーザーとアカウントのすべてのレッスン

自分で練習してみよう: Djangoプレイグラウンド