ノートには所有者がいる
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が実行されます。
チャレンジ
中級各メモに所有者を設定します。
notes/models.pyで、Noteにownerフィールドを追加します。これはsettings.AUTH_USER_MODELへのForeignKeyで、on_delete=models.CASCADEとrelated_name="notes"を指定します。django.confからsettingsをインポートします。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プレイグラウンド