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

    压缩包: 链接

posted @ 2023-06-12 02:52  火焰马  阅读(7)  评论(0编辑  收藏  举报