006_让用户拥有自己的数据
/* 一: 限制访问 1 login_required 2 LOGIN_URL 3 全面限制 二: 数据关联用户 1 修改模型Topic 2 确定用户 3 迁移数据库 4 验证迁移 三: 保护设置 1 只允许用户访问标题 2 保护用户标题 3 保护编辑页面 4 新主题关联到用户 四: 完整code */
一: 限制访问
1 login_required
1 使用装饰器: @login_required,只有登录才能访问该页面
2 LOGIN_URL
1 设置: 未登录用户请求@login_required的页面,设置重定向URL。
3 全面限制
二: 数据关联用户
1 修改模型Topic
1 输入命令:
owner = models.ForeignKey(User, on_delete=models.CASCADE)
''' 1 owner:这是一个 ForeignKey,表示一个多对一的关系。 2 这个字段用于将每个主题关联到一个用户。 3 User是Django自带的用户模型,on_delete=models.CASCADE 指定了当关联的 User 对象被删除时,所有关联的 Topic 对象也会被删除。 '''
2 确定用户
1 输入命令:
python manage.py shell from django.contrib.auth.models import User User.objects.all() # 显示所有用户 for user in User.objects.all(): print(user.username, user.id) # 显示用户和对应唯一id
3 迁移数据库
''' # 创建新的迁移文件 : 从当前数据库结构(或上一次迁移)到 - 新的模型结构的改变。 python .\manage.py makemigrations learning_logs # 添加默认值2种选择 : 1现在提供; 2推出添加。 Select an option: 1 # 输入用户ID。 >>> 1 # 执行迁移文件中的指令,修改数据库。 python manage.py migrate '''
4 验证迁移
''' > python manage.py shell >>> from learning_logs.models import Topic >>> for topic in Topic.objects.all(): ... print(topic, topic.owner) # 显示主题 和 该主题所属用户 '''
三: 保护设置
1 只允许用户访问标题
1 输入代码:
topics = Topic.objects.filter(owner=request.user).order_by('date_added')
''' 1 Topic.objects:这是Django模型的管理器,它是Django提供的一个接口,用于查询数据库。每个 Django 模型类都有一个默认的管理器,名为 objects。 2 .filter(owner=request.user):这是一个过滤器,它返回一个新的查询集,包含了所有owner字段等于 request.user 的 Topic 对象。换句话说,它获取了当前用户所有的主题。 3 .order_by('date_added'):这是一个排序函数,它返回一个新的查询集,包含了按照 date_added 字段排序的 Topic 对象。 '''
2 保护用户标题
1 输入代码:
from django.http import Http404 # 确认请求的主题属于当前用户 if topic.owner != request.user: raise Http404
3 保护编辑页面
1 输入代码:
# 确认请求的主题属于当前用户 if topic.owner != request.user: raise Http404
4 新主题关联到用户
1 输入代码:
if form.is_valid(): new_topic = form.save(commit=False) new_topic.owner = request.user new_topic.save()
''' if form.is_valid(): 检查表单数据是否有效。当一个表单被提交时,通过调用表单的 is_valid() 方法来检查提交的数据是否符合表单字段的要求。 new_topic = form.save(commit=False):调用表单的 save() 方法来创建一个新的 Topic 对象,但是还不保存到数据库。commit=False 参数告诉 Django 只创建模型对象,但是不保存到数据库。 new_topic.owner = request.user:将新的 Topic 对象的 owner 字段设置为当前用户。request.user 是一个 Django 提供的属性,表示当前请求的用户。 new_topic.save():这行代码将新的 Topic 对象保存到数据库。在这一步,new_topic 对象的所有字段都已经设置好,所以可以安全地保存到数据库。 '''
四: 完整code
压缩包: 链接