视图入门
在编程中,视图通常是向用户显示信息的组件。 视图执行的任务可能因框架和约定而异,包括加载数据的责任。
在 Django 中,视图通常负责:
- 验证用户的请求。
- 加载或修改相应的数据。
- 将包含信息的 HTML 模板返回给用户。
我们将通过讨论如何手动创建视图并配置适当的 URLconf 进行探索。 URLconf 是一个路径列表,指明要匹配的模式、要调用的函数和可选的名称。 在后面的单元中,我们将了解 Django 如何自动处理我们手动编写的某些代码。
创建视图
若要在 Django 中从头开始创建视图,通常需要创建一个函数。 该函数通常包含执行以下操作的相应代码:
- 执行用户已请求的任务。
- 返回一个模板,其中包含要显示给用户的相应数据。
视图函数始终采用至少一个名为 request
的参数,该参数表示用户的请求。 如果需要 URL 中用户的更多信息(例如项的名称或 ID),可以根据需要提供更多参数。 你将在创建路由时注册它们,我们稍后会在本单元中进行讨论。
正在加载数据
你可以使用 Django ORM 从已注册的数据库加载所需的任何数据。
要构建的项目具有两个模型:Shelter
和 Dog
。 我们可以使用所创建的模型加载所有对象或执行其他查询。 例如,要加载所有收容所,可使用 Shelter.objects.all()
。 可使用 Shelter.objects.get(pk=1)
加载单个收容所。
注意
pk
是主键的快捷方式。 使用 id
可得到相同的结果,但是如果已将表示主键的属性更改为其他名称,则使用 pk
可确保命令有效。
404 错误
web 应用程序中的 404 错误的意思是“找不到”。最佳做法是,每当对不存在的对象发出请求时,均应返回 404。
Django 提供了用于尝试加载数据的快捷方式:
get_object_or_404
和get_list_or_404
:通过主键加载对象,如果找不到对象,则向用户返回 404。get_list_or_404
:执行的操作与其他快捷方式执行的相同,只不过它接受筛选器参数。
我们将在练习中使用 get_object_or_404
。
呈现模板
Django 的模板化引擎将获取我们生成的 HTML 模板,将其与我们提供的任何数据合并,并为浏览器发出 HTML。 用于执行此任务的帮助程序函数为 render
。
render
函数需要表示请求的对象,这是我们前面突出显示的 request
参数。 你还会传入模板的名称,通常是一个 HTML 文件,该文件将驻留在名为“模板”的文件夹中。
要将数据传递到模板,需向 context
字典对象提供 render
。 context
对象包含一组键/值对,其中每个键都成为模板中的一个变量。
示例
若要创建一个视图来显示所有收容所,可以使用以下代码:
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 函数一样。