使用通用视图显示数据
Django 中的通用视图系统可简化重复代码的创建。 在数据驱动的应用程序中执行的常见操作具有同一模式。 例如,若要按 ID 或主键显示单个项,则工作流始终:
- 按 ID 从数据库加载项。
- 如果找不到该项,则返回 404。
- 如果找到该项,请将该项传递到模板以进行显示。
通用视图系统确认这一事实,并提供你可以使用的类,这些类包含已经编写的核心代码。 你从适当的类继承,设置几个属性,然后在 URLconf 中注册适当的路径。 其余部分会为你处理好!
Django 包含两个用于显示数据的通用视图:DetailView
和 ListView
。
项详细信息的 DetailView
通用视图 DetailView
用于显示项的详细信息页。 DetailView
检索由主键指定的 model
的项并将其传递给模板。 可以将 template_name
设置为要使用的模板的名称。 默认为 <model>_detail.html
。 最后,我们可以将 context_object_name
设置为要在模板中使用的变量的名称。
若要使用狗的通用视图创建详细信息视图,可以使用以下代码:
from . import models
from django.views import generic
class DogDetailView(generic.DetailView):
model = models.Dog
template_name = 'dog_detail.html'
context_object_name = 'dog'
注册 DogDetailView
类似于任何其他 path
条目。 关键是要确保包含名为 pk
的参数。 Django 使用此约定来标识主键。 你还会注意到,我们使用 as_view()
方法将类转换为视图。
path('dog/<int:pk>', views.DogDetailView.as_view(), name='dog_detail')
项列表的 ListView
通用视图 ListView
的行为方式与 DetailView
类似。 可以将 context_object_name
设置为视图中的变量名称,并将 template_name
设置为模板的名称。
主要区别在于,ListView
旨在处理返回多个项的任何形式的查询。 因此,必须替代 get_queryset
函数。 通用视图系统调用函数 get_queryset
从数据库中检索项,这允许你根据需要对项进行排序或筛选。
若要使用通用视图 ListView
创建视图以显示所有收容所的列表,可以使用以下代码:
from . import models
from django.views import generic
class ShelterListView(generic.ListView):
template_name = 'shelter_list.html'
context_object_name = 'shelters'
def get_queryset(self):
return models.Shelter.objects.all()
注册视图的方式与我们的 DetailView
非常相似。
path('', ShelterListView.as_view(), name='shelter_list')