设置外键
学习并练习外键设置,以在模型之间建立关系。
网站上的房源列表目前尚未与任何用户关联。由于用户不希望看到其他人的房源,因此我们将使用外键来追踪每条房源是由哪位用户创建的。
外键是一种在模型中建立关系的方式。在本例中,关系存在于房源和用户之间。每条房源都将归属于创建它的特定用户。
更新模型
更新后的模型(listings/models.py)如下所示:
No configuration found for ID: ea6545ea77e58d39b46bcdfa23d13c6f24116e6c6c5e5849f1025b2fa2028379
在第23行,Listings 模型通过外键与 User 模型关联。null=True 表示该字段允许为空值。on_delete=models.CASCADE 的含义是:当删除某个用户时,所有与该用户相关的房源也会被一同删除,就像级联效应一样。
更新视图
我们还做了一项额外修改,确保房源能正确分配给特定用户。打开 listings/views.py 查看这些更改。
表单与之前几乎完全相同,唯一的区别是将填写好的表单保存到实例变量中(第23行)。由于设置了 commit=False,此时数据库中的更改尚未提交,表单不会立即保存到数据库。
在第24行,request.user 会获取当前登录的用户。这个用户将被绑定到正在创建的房源上。获取创建房源的用户后,我们在第25行调用 instance.save() 来保存表单。此时,更改才会真正写入数据库。
测试功能
在修改模型后,请先执行迁移命令再启动服务器。
1python manage.py makemigrations 2python manage.py migrate 3python manage.py runserver
现在运行应用即可测试外键设置。
登录管理后台,尝试创建一条房源。使用以下凭证访问管理员面板:
- 用户名: educative
- 密码: edu123
注意,表单中多出了一个名为 用户 的字段,如下图所示:
点击该字段时,只会显示已存在的用户。在此情况下,会出现 educative 用户。你可以从这里创建房源,并将其分配给 educative 用户。
如果你通过管理后台创建房源,会发现地址字段出现在表单中。必须在此输入地址,否则无法提交表单。不用担心,地址不会在网站上显示,因为我们选择不展示该字段。
你也可以前往网站前端自行创建房源。这有助于验证所做的更改是否生效。当你创建房源时,用户 字段会自动识别并绑定当前登录用户。建议创建几位用户,并为每位用户至少创建一条房源进行测试。