关于“Python”的核心知识点整理大全59

这篇具有很好参考价值的文章主要介绍了关于“Python”的核心知识点整理大全59。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于“Python”的核心知识点整理大全59,掌握Python分类专栏:开启智能数据处理之旅!,python,python,数据库,sqlite,笔记,开发语言

目录

19.3.2 将数据关联到用户

1. 修改模型Topic

models.py

2. 确定当前有哪些用户

3. 迁移数据库

注意

19.3.3 只允许用户访问自己的主题

views.py

19.3.4 保护用户的主题

views.py

views.py

19.3.6 将新主题关联到当前用户

views.py

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!


关于“Python”的核心知识点整理大全59,掌握Python分类专栏:开启智能数据处理之旅!,python,python,数据库,sqlite,笔记,开发语言

19.3.2 将数据关联到用户

现在,需要将数据关联到提交它们的用户。我们只需将最高层的数据关联到用户,这样更低 层的数据将自动关联到用户。例如,在项目“学习笔记”中,应用程序的最高层数据是主题,而 所有条目都与特定主题相关联。只要每个主题都归属于特定用户,我们就能确定数据库中每个条 目的所有者。

下面来修改模型Topic,在其中添加一个关联到用户的外键。这样做后,我们必须对数据库 进行迁移。最后,我们必须对有些视图进行修改,使其只显示与当前登录的用户相关联的数据。

1. 修改模型Topic

对models.py的修改只涉及两行代码:

models.py
from django.db import models
from django.contrib.auth.models import User
class Topic(models.Model):
 """用户要学习的主题"""
 text = models.CharField(max_length=200)
 date_added = models.DateTimeField(auto_now_add=True)
 owner = models.ForeignKey(User)
 def __str__(self):
 """返回模型的字符串表示"""
 return self.text
class Entry(models.Model):
 --snip-- 

我们首先导入了django.contrib.auth中的模型User,然后在Topic中添加了字段owner,它建 立到模型User的外键关系。

2. 确定当前有哪些用户

我们迁移数据库时,Django将对数据库进行修改,使其能够存储主题和用户之间的关联。为 执行迁移,Django需要知道该将各个既有主题关联到哪个用户。最简单的办法是,将既有主题都 关联到同一个用户,如超级用户。为此,我们需要知道该用户的ID。

下面来查看已创建的所有用户的ID。为此,启动一个Django shell会话,并执行如下命令:

(venv)learning_log$ python manage.py shell
1 >>> from django.contrib.auth.models import User
2 >>> User.objects.all()
[<User: ll_admin>, <User: eric>, <User: willie>]
3 >>> for user in User.objects.all():
... print(user.username, user.id)
...
ll_admin 1
eric 2
willie 3
>>> 

在1处,我们在shell会话中导入了模型User。然后,我们查看到目前为止都创建了哪些用户 (见2)。输出中列出了三个用户:ll_admin、eric和willie。

在3处,我们遍历用户列表,并打印每位用户的用户名和ID。Django询问要将既有主题关联 到哪个用户时,我们将指定其中的一个ID值。

3. 迁移数据库

知道用户ID后,就可以迁移数据库了。

1 (venv)learning_log$ python manage.py makemigrations learning_logs
2 You are trying to add a non-nullable field 'owner' to topic without a default;
we can't do that (the database needs something to populate existing rows).
3 Please select a fix:
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
4 Select an option: 1
5 Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now()
6 >>> 1
Migrations for 'learning_logs':
 0003_topic_owner.py:
 - Add field owner to topic 

我们首先执行了命令makemigrations(见1)。在2处的输出中,Django指出我们试图给既有 模型Topic添加一个必不可少(不可为空)的字段,而该字段没有默认值。在3处,Django给我 们提供了两种选择:要么现在提供默认值,要么退出并在models.py中添加默认值。在4处,我们 选择了第一个选项,因此Django让我们输入默认值(见5)。

为将所有既有主题都关联到管理用户ll_admin,我输入了用户ID值1(见6)。并非必须使用 超级用户,而可使用已创建的任何用户的ID。接下来,Django使用这个值来迁移数据库,并生成 了迁移文件0003_topic_owner.py,它在模型Topic中添加字段owner。

现在可以执行迁移了。为此,在活动的虚拟环境中执行下面的命令:

(venv)learning_log$ python manage.py migrate
Operations to perform:
 Synchronize unmigrated apps: messages, staticfiles
 Apply all migrations: learning_logs, contenttypes, sessions, admin, auth
--snip--
Running migrations:
 Rendering model states... DONE
1 Applying learning_logs.0003_topic_owner... OK
(venv)learning_log$ 

Django应用新的迁移,结果一切顺利(见1)。

为验证迁移符合预期,可在shell会话中像下面这样做:

1 >>> from learning_logs.models import Topic
2 >>> for topic in Topic.objects.all():
... print(topic, topic.owner)
...
Chess ll_admin
Rock Climbing ll_admin
>>>

我们从learning_logs.models中导入Topic(见1),再遍历所有的既有主题,并打印每个主 题及其所属的用户(见2)。正如你看到的,现在每个主题都属于用户ll_admin。


注意

你可以重置数据库而不是迁移它,但如果这样做,既有的数据都将丢失。一种不错的做 法是,学习如何在迁移数据库的同时确保用户数据的完整性。如果你确实想要一个全新 的数据库,可执行命令python manage.py flush,这将重建数据库的结构。如果你这样做, 就必须重新创建超级用户,且原来的所有数据都将丢失。


19.3.3 只允许用户访问自己的主题

当前,不管你以哪个用户的身份登录,都能够看到所有的主题。我们来改变这种情况,只向 用户显示属于自己的主题。 在views.py中,对函数topics()做如下修改:

views.py
--snip--
@login_required
def topics(request):
 """显示所有的主题"""
 topics = Topic.objects.filter(owner=request.user).order_by('date_added')
 context = {'topics': topics}
 return render(request, 'learning_logs/topics.html', context)
--snip--

用户登录后,request对象将有一个user属性,这个属性存储了有关该用户的信息。代码 Topic.objects.filter(owner=request.user)让Django只从数据库中获取owner属性为当前用户的 Topic对象。由于我们没有修改主题的显示方式,因此无需对页面topics的模板做任何修改。 要查看结果,以所有既有主题关联到的用户的身份登录,并访问topics页面,你将看到所有 的主题。然后,注销并以另一个用户的身份登录,topics页面将不会列出任何主题。

19.3.4 保护用户的主题

我们还没有限制对显示单个主题的页面的访问,因此任何已登录的用户都可输入类似于 http://localhost:8000/topics/1/的URL,来访问显示相应主题的页面。

你自己试一试就明白了。以拥有所有主题的用户的身份登录,访问特定的主题,并复制该页 面的URL,或将其中的ID记录下来。然后,注销并以另一个用户的身份登录,再输入显示前述主 题的页面的URL。虽然你是以另一个用户登录的,但依然能够查看该主题中的条目。 为修复这种问题,我们在视图函数topic()获取请求的条目前执行检查:

views.py
from django.shortcuts import render
1 from django.http import HttpResponseRedirect, Http404
from django.core.urlresolvers import reverse
--snip--
@login_required
def topic(request, topic_id):
 """显示单个主题及其所有的条目"""
 topic = Topic.objects.get(id=topic_id)
 # 确认请求的主题属于当前用户
2 if topic.owner != request.user:
 raise Http404 
entries = topic.entry_set.order_by('-date_added')
 context = {'topic': topic, 'entries': entries}
 return render(request, 'learning_logs/topic.html', context)
--snip--

服务器上没有请求的资源时,标准的做法是返回404响应。在这里,我们导入了异常Http404 (见1),并在用户请求它不能查看的主题时引发这个异常。收到主题请求后,我们在渲染网页前 检查该主题是否属于当前登录的用户。如果请求的主题不归当前用户所有,我们就引发Http404 异常(见2),让Django返回一个404错误页面。

现在,如果你试图查看其他用户的主题条目,将看到Django发送的消息Page Not Found。在 第20章,我们将对这个项目进行配置,让用户看到更合适的错误页面。

19.3.5 保护页面 edit_entry

页面edit_entry的URL为http://localhost:8000/edit_entry/entry_id/,其中entry_id是一 个数字。下面来保护这个页面,禁止用户通过输入类似于前面的URL来访问其他用户的条目:

views.py
--snip--
@login_required
def edit_entry(request, entry_id):
 """编辑既有条目"""
 entry = Entry.objects.get(id=entry_id)
 topic = entry.topic
 if topic.owner != request.user:
 raise Http404
 if request.method != 'POST':
 # 初次请求,使用当前条目的内容填充表单
 --snip-- 

我们获取指定的条目以及与之相关联的主题,然后检查主题的所有者是否是当前登录的用 户,如果不是,就引发Http404异常。

19.3.6 将新主题关联到当前用户

当前,用于添加新主题的页面存在问题,因此它没有将新主题关联到特定用户。如果你尝试 添加新主题,将看到错误消息IntegrityError,指出learning_logs_topic.user_id不能为NULL。 Django的意思是说,创建新主题时,你必须指定其owner字段的值。

由于我们可以通过request对象获悉当前用户,因此存在一个修复这种问题的简单方案。请 添加下面的代码,将新主题关联到当前用户:

views.py

关于“Python”的核心知识点整理大全37-CSDN博客

关于“Python”的核心知识点整理大全25-CSDN博客

关于“Python”的核心知识点整理大全12-CSDN博客文章来源地址https://www.toymoban.com/news/detail-800299.html

往期快速传送门👆(在文章最后):

感谢大家的支持!欢迎订阅收藏!专栏将持续更新!

到了这里,关于关于“Python”的核心知识点整理大全59的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于“Python”的核心知识点整理大全57

    目录 3. 模板edit_entry edit_entry.html 4. 链接到页面edit_entry topic.html 19.2 创建用户账户 19.2.1 应用程序 users 1. 将应用程序users添加到settings.py中 settings.py 2. 包含应用程序users的URL urls.py 19.2.2 登录页面 urls.py 1. 模板login.html login.html 2. 链接到登录页面 base.html 3. 使用登录页面 往期快速传

    2024年01月24日
    浏览(42)
  • 关于“Python”的核心知识点整理大全25

    目录 10.3.4 else 代码块、 10.3.5 处理 FileNotFoundError 异常 alice.py 在这个示例中,try代码块引发FileNotFoundError异常,因此Python找出与该错误匹配的 except代码块,并运行其中的代码。最终的结果是显示一条友好的错误消息,而不是traceback: 10.3.6 分析文本 10.3.7 使用多个文件 word_cou

    2024年02月04日
    浏览(46)
  • 关于“Python”的核心知识点整理大全17

    目录 ​编辑 8.3.4 结合使用函数和 while 循环 greeter.py 8.4 传递列表 greet_users.py 8.4.1 在函数中修改列表 printing_models.py 8.4.2 禁止函数修改列表 要将列表的副本传递给函数,可以像下面这样做: 往期快速传送门👆(在文章最后): 感谢大家的支持!欢迎订阅收藏!专栏将持续更

    2024年02月04日
    浏览(36)
  • 关于“Python”的核心知识点整理大全42

    目录 game_functions.py game_functions.py game_functions.py alien_invasion.py 14.4 小结 第15 章 生成数据 15.1 安装 matplotlib 15.1.1 在 Linux 系统中安装 matplotlib 15.1.2 在 OS X 系统中安装 matplotlib 注意 15.1.3 在 Windows 系统中安装 matplotlib 注意 15.1.4 测试 matplotlib 注意 15.1.5 matplotlib 画廊 15.2 绘制简单的

    2024年02月03日
    浏览(114)
  • 关于“Python”的核心知识点整理大全23

    目录 ​编辑 第10 章 文件和异常 10.1 从文件中读取数据 10.1.1 读取整个文件 pi_digits.txt file_reader.py 10.1.2 文件路径 10.1.3 逐行读取 file_reader.py 10.1.4 创建一个包含文件各行内容的列表 10.1.5 使用文件的内容 pi_string.py 往期快速传送门👆(在文章最后): 感谢大家的支持!欢迎订

    2024年02月03日
    浏览(53)
  • 关于“Python”的核心知识点整理大全45

    目录 15.4.6 绘制直方图 die_visual.py 注意 15.4.7 同时掷两个骰子 dice_visual.py 15.4.8 同时掷两个面数不同的骰子 different_dice.py 15.5 小结 第 16 章 16.1 CSV 文件格式 16.1.1 分析 CSV 文件头 highs_lows.py 注意 16.1.2 打印文件头及其位置 highs_lows.py 往期快速传送门👆(在文章最后): 感谢大家

    2024年02月04日
    浏览(37)
  • 关于“Python”的核心知识点整理大全64

    目录 20.2.15 确保项目的安全 settings.py 20.2.16 提交并推送修改 20.2.17 创建自定义错误页面 1. 创建自定义模板 500.html settings.py settings.py 注意 views.py 20.2.18 继续开发 往期快速传送门👆(在文章最后): 感谢大家的支持!欢迎订阅收藏!专栏将持续更新! 当前,我们部署的项目存

    2024年02月03日
    浏览(78)
  • 关于“Python”的核心知识点整理大全21

    在Python 2.7中,继承语法稍有不同,ElectricCar类的定义类似于下面这样: 函数super()需要两个实参:子类名和对象self。为帮助Python将父类和子类关联起来,这些 实参必不可少。另外,在Python 2.7中使用继承时,务必在定义父类时在括号内指定object。 9.3.3 给子类定义属性和方法

    2024年01月16日
    浏览(41)
  • 关于“Python”的核心知识点整理大全29

    目录 11.2.4 方法 setUp() 注意 11.3 小结 第二部分 项目1 外星人入侵 第12 章 武装飞船 注意 12.1 规划项目 12.2 安装 Pygame 注意 12.2.1 使用 pip 安装 Python 包 注意 如果你启动终端会话时使用的是命令python3,那么在这里应使用命令sudo python3 get-pip.py。 12.2.2 在 Linux 系统中安装 Pygame 往

    2024年02月04日
    浏览(27)
  • 关于“Python”的核心知识点整理大全63

    目录 20.2.11 使用 Git 跟踪项目文件 1. 安装Git 2. 配置Git 3. 忽略文件 .gitignore 注意 4. 提交项目 20.2.12 推送到 Heroku 注意 20.2.13 在 Heroku 上建立数据库 20.2.14 改进 Heroku 部署 1. 在Heroku上创建超级用户 注意 注意 如果你阅读完了第17章,就知道Git是一个版本控制程序,让你能够在每次

    2024年01月25日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包