Django官方文档学习day4

Django 测试工具之 Client

Django 提供了一个供测试使用的 Client 来模拟用户和视图层代码的交互。我们能在 tests.py 甚至是 shell 中使用它。

通用视图

如何建立 get_queryset 与 context_object_name

在你给出的基于函数的视图 index 中,我们可以看到 latest_question_list 是通过 Question.objects.order_by(“-pub_date”)[:5] 获取的,并随后被添加到 context 中,这样它就可以在模板中使用了。

现在,当我们转向使用基于类的视图,特别是 ListView,Django 提供了一种更结构化的方法来处理这些常见模式。

这里是如何建立 get_queryset 与 context_object_name 之间的联系的:

get_queryset 方法: 这个方法定义了如何获取对象列表。在你的例子中,它返回最新的5个问题。这相当于之前在函数视图中的 latest_question_list = Question.objects.order_by(“-pub_date”)[:5] 部分。

context_object_name 属性: 这个属性定义了如何在模板中引用由 get_queryset 获取的对象列表。在你的例子中,context_object_name 被设置为 latest_question_list。

当 ListView 处理请求时,它会这样做:

首先,调用 get_queryset 来获取对象列表。
然后,它将这个列表添加到上下文中,使用 context_object_name 定义的名称作为键。如果你没有指定 context_object_name,默认键名是模型名称加上 _list(例如,question_list)。
这就是 get_queryset 和 context_object_name 如何相互关联以及如何与模板一起工作的。实质上,它们共同完成了你在函数视图中手动执行的任务,但提供了更清晰和结构化的方式来实现相同的效果。

DetailView的默认变量名

Django能够确定一个适当的上下文变量名:这意味着 Django 有一个约定或规则来确定这个变量的名称。对于 DetailView,默认的上下文变量名称是它处理的模型的小写形式。所以,对于 Question 模型,自动生成的上下文变量名就是 question。

初试 API

例如

一旦创建 数据模型 后,Django 自动给予你一套数据库抽象 API,允许你创建,检索,更新和删除对象。本页介绍如何使用这些 API。参考 数据模型参考 获取所有查询选项的完整细节。

什么时候用双下划线,什么时候用点

Question.objects.filter(pub_date__lte=timezone.now()).order_by(“-pub_date”)[:5 ]
在 Django 的 ORM 中,双下划线 __ 和点 . 有不同的用途。让我们来看看它们各自的作用:

双下划线 __:

字段查找:如前面的例子中的 pub_date__lte。lte 是一个查找类型,代表 “less than or equal to”,而 pub_date 是模型的一个字段。双下划线 __ 用于将字段名和查找类型连接起来。
关系查找:如果你有一个外键或其他的关联字段,你可以使用双下划线 __ 来查询与该字段关联的模型的字段。例如,假设 Question 模型有一个外键 category 连接到 Category 模型,并且 Category 有一个字段 name,你可以这样查询:Question.objects.filter(category__name=‘Sports’)。这样你可以获取属于 “Sports” 类别的所有问题。
点 .:

属性或方法访问:在 Python 中,点 . 用于访问对象的属性或方法。在 Django 的 ORM 中,点也用于这个目的。例如,如果你有一个 Question 对象 q,你可以使用 q.pub_date 来访问其 pub_date 属性。
模型关系导航:当你的模型中有外键或其他关联字段时,你可以使用点 . 来导航到与之关联的对象。继续上面的例子,如果 q 是一个 Question 对象,并且有一个外键 category,你可以使用 q.category 来获取与该问题相关联的 Category 对象。
因此,双下划线 __ 和点 . 在 Django 的 ORM 中都有其特定的用途。它们都是用于查询和导航模型和它们的关系的工具,但它们在具体的使用场景和方式上有所不同。

shortcut function(快捷函数)

如果你正在使用Django框架,那么确实,Django中的"快捷函数"往往是独立定义的,不是写在类里面的。这些函数主要用于简化某些常见操作,使得开发更加高效。

好处

封装功能,减少重复代码

测试

断言函数

三个都是断言函数,用于测试中来验证特定的条件或者状态是否满足预期。这些断言函数都是Django的测试框架中的方法。具体解释如下:

self.assertIs(recent_question.was_published_recently(), True): 这是一个断言函数,用于检查recent_question.was_published_recently()的返回值是否是True。

self.assertEqual(response.status_code, 200): 这是一个断言函数,用于检查response.status_code的值是否等于200。在HTTP中,状态码200通常表示请求成功。

self.assertContains(response, “No polls are available.”): 这个断言函数检查响应response中是否包含特定的文本内容,即"No polls are available."。这在验证特定页面或API响应的内容中非常有用。

使用断言函数在测试中是非常重要的,因为它们可以帮助验证代码的行为是否与预期相符。如果某个断言失败,则测试将失败,这通常意味着代码中存在错误或者测试用例本身存在问题。

self.assertEqual(response.status_code, 200):这确保请求被成功处理。
self.assertContains(response, “No polls are available.”):这确保响应的内容中有 “No polls are available.” 这个特定的文本。这是验证页面实际显示了预期信息的一种方式。
self.assertQuerySetEqual(response.context[“latest_question_list”], []):这确保响应上下文中的 latest_question_list 是空的。这直接验证了后端的数据,确保没有投票被传递给模板。

这三个断言共同确保了以下几点:

请求被正确处理。
页面显示了正确的信息。
后端的数据也是预期的。
这种多层次的验证可以确保应用的各个部分(从数据库到模板渲染)都按预期工作。

测试的形象比喻

实际上,测试就是假装一些管理员的输入,然后通过用户端的表现是否符合预期来判断新加入的改变是否破坏了原有的系统状态。

Customize your app’s look and feel(自定义应用的界面和风格),静态文件

路径

Django 的 STATICFILES_FINDERS 设置包含了一系列的查找器,它们知道去哪里找到 static 文件。AppDirectoriesFinder 是默认查找器中的一个,它会在每个 INSTALLED_APPS 中指定的应用的子文件中寻找名称为 static 的特定文件夹,就像我们在 polls 中刚创建的那个一样。管理后台采用相同的目录结构管理它的静态文件。

在你刚创建的 static 文件夹中创建一个名为 polls 的文件夹,再在 polls 文件夹中创建一个名为 style.css 的文件。换句话说,你的样式表路径应是 polls/static/polls/style.css。因为 AppDirectoriesFinder 的存在,你可以在 Django 中以 polls/style.css 的形式引用此文件,类似你引用模板路径的方式。

加入在html中的具体位置

head
确保将 {% load static %} 和 这两行代码添加到 区域内。这样,当 HTML 页面加载时,浏览器会知道需要先加载并应用 style.css 中的样式规则。

static的不能用的地方

{% static %}只适用于Django处理的模板文件。对于纯静态文件,如CSS、JavaScript文件等,由于它们不经过Django的模板处理系统,因此不能使用 {% static %} 标签。在这些文件中,应使用相对路径来引用其他静态资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值