使用通用视图显示数据

已完成

Django 中的通用视图系统可简化重复代码的创建。 在数据驱动的应用程序中执行的常见操作具有同一模式。 例如,若要按 ID 或主键显示单个项,则工作流始终:

  1. 按 ID 从数据库加载项。
  2. 如果找不到该项,则返回 404。
  3. 如果找到该项,请将该项传递到模板以进行显示。

通用视图系统确认这一事实,并提供你可以使用的类,这些类包含已经编写的核心代码。 你从适当的类继承,设置几个属性,然后在 URLconf 中注册适当的路径。 其余部分会为你处理好!

Django 包含两个用于显示数据的通用视图:DetailViewListView

项详细信息的 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')