Menu
CoddyTech

每条笔记都有所有者

本课属于 Coddy Django 学习旅程的“用户和账户”单元。第 8 课,共 16 课。

每个已登录用户都共用同一堆笔记。为了区分笔记,每条笔记都要记录作者:使用 ForeignKey,就像书籍关联作者一样。

要关联用户,不要导入 User。将 ForeignKey 指向设置项 settings.AUTH_USER_MODEL(在 from django.conf import settings 之后),这个设置项指定了用户模型,此处是 "auth.User"。这样,代码在使用自定义用户模型的项目中也能正常运行。

作者不是表单字段:如果用户能选择作者,就可能冒充其他人来写笔记。由视图填入作者。和“表单”单元中的做法一样,form.save(commit=False) 会创建对象但不保存,因此视图可以设置表单中没有的字段:

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

点击“运行”会为新字段执行 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 在线编辑器