视图入门

已完成

在编程中,视图通常是向用户显示信息的组件。 视图执行的任务可能因框架和约定而异,包括加载数据的责任。

在 Django 中,视图通常负责:

  • 验证用户的请求。
  • 加载或修改相应的数据。
  • 将包含信息的 HTML 模板返回给用户。

我们将通过讨论如何手动创建视图并配置适当的 URLconf 进行探索。 URLconf 是一个路径列表,指明要匹配的模式、要调用的函数和可选的名称。 在后面的单元中,我们将了解 Django 如何自动处理我们手动编写的某些代码。

创建视图

若要在 Django 中从头开始创建视图,通常需要创建一个函数。 该函数通常包含执行以下操作的相应代码:

  • 执行用户已请求的任务。
  • 返回一个模板,其中包含要显示给用户的相应数据。

视图函数始终采用至少一个名为 request 的参数,该参数表示用户的请求。 如果需要 URL 中用户的更多信息(例如项的名称或 ID),可以根据需要提供更多参数。 你将在创建路由时注册它们,我们稍后会在本单元中进行讨论。

正在加载数据

你可以使用 Django ORM 从已注册的数据库加载所需的任何数据。

要构建的项目具有两个模型:ShelterDog。 我们可以使用所创建的模型加载所有对象或执行其他查询。 例如,要加载所有收容所,可使用 Shelter.objects.all()。 可使用 Shelter.objects.get(pk=1) 加载单个收容所。

注意

pk 是主键的快捷方式。 使用 id 可得到相同的结果,但是如果已将表示主键的属性更改为其他名称,则使用 pk 可确保命令有效。

404 错误

web 应用程序中的 404 错误的意思是“找不到”。最佳做法是,每当对不存在的对象发出请求时,均应返回 404。

Django 提供了用于尝试加载数据的快捷方式:

  • get_object_or_404get_list_or_404:通过主键加载对象,如果找不到对象,则向用户返回 404。
  • get_list_or_404:执行的操作与其他快捷方式执行的相同,只不过它接受筛选器参数。

我们将在练习中使用 get_object_or_404

呈现模板

Django 的模板化引擎将获取我们生成的 HTML 模板,将其与我们提供的任何数据合并,并为浏览器发出 HTML。 用于执行此任务的帮助程序函数为 render

render 函数需要表示请求的对象,这是我们前面突出显示的 request 参数。 你还会传入模板的名称,通常是一个 HTML 文件,该文件将驻留在名为“模板”的文件夹中

要将数据传递到模板,需向 context 字典对象提供 rendercontext 对象包含一组键/值对,其中每个键都成为模板中的一个变量。

示例

若要创建一个视图来显示所有收容所,可以使用以下代码:

def shelter_list(request):
    shelters = Shelter.objects.all()
    context = { 'shelters': shelters }
    return render(request, 'shelter_list.html', context)

注册路径

几乎所有 Web 框架都使用路径来处理用户请求。 路径将 URL 中位于域名之后、查询字符串(位于问号之后)之前的部分转换为函数调用。

调用 www.contoso.com/shelters 可能会调用一个函数来列出所有收容所,而调用 www.contoso.com/shelters/1 可能会调用一个函数来显示 ID 为 1 的收容所。 通过创建 URLconf 在 Django 中注册路径。

假设有一个名为 views 的模块,它是一个 Django 约定。 我们可以使用以下路径将未指定路径(如 www.contoso.com)的索引流量路由到 views 中名为 index 的函数,并将其命名为 index

path('', views.index, 'index')

还可以为特定请求创建虚拟文件夹。 例如,如果想在用户请求“/shelters”时列出所有收容所,可使用以下命令

path('shelters', views.shelter_list, 'shelter_list')

URL 参数

常见的做法是将参数作为 URL 的一部分传递到应用程序,如 ID 或名称。 因为这些值会改变,所以我们不想将它们硬编码到我们的路径中。 在 Django 中,可以使用特殊语法指定参数。 在该语法中,可以指定所需的数据类型,例如整数和名称。

例如,要创建一个路径,允许用户按 ID 请求特定的收容所,则需要一个类型为 integer 的参数。 (原因是我们的主键是一个整数。)然后,我们可以提供要用于变量的名称,并将其作为参数传递给视图函数。 标识此参数的语法为 <int:pk>。 请注意类型声明、冒号和变量名称。

完整路径可能如下所示:

path('shelter/<int:pk>', views.shelter_detail, name='shelter_detail')

关联的视图函数将具有以下签名:

def shelter_detail(request, pk):
    # code

路径签名的 pk 部分作为参数传递到 shelter_detail,就像我们调用一个常规 Python 函数一样。