📜  DetailView – 基于类的视图 Django(1)

📅  最后修改于: 2023-12-03 14:40:42.699000             🧑  作者: Mango

DetailView – 基于类的视图 Django

介绍

DetailView是Django中的一种基于类的视图,用于在模板中显示单个模型实例的详细信息。DetailView通常用于显示单个对象的详细信息页面,例如文章详情页、产品详情页等。

语法

DetailView的语法格式为:

class DetailView(TemplateResponseMixin, ContextMixin, View):
    model = None
    queryset = None
    slug_field = 'slug'
    slug_url_kwarg = 'slug'
    pk_url_kwarg = 'pk'
    context_object_name = None
    template_name = None
    template_engine = None
    extra_context = None
   
    def get(self, request, *args, **kwargs):
        self.object = self.get_object()
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)
      
    def get_object(self, queryset=None):
        ...
        
    def get_queryset(self):
        ...
        
    def get_context_data(self, **kwargs):
        ...
参数
  • model:模型名称,必传参数,用于指定该视图展示的模型。
  • queryset:查询集,可选参数,用于指定查询集合。如果未指定查询集,并且未重写 get_queryset() 方法,则将根据该模型获取所有对象列表。
  • slug_field:slug属性名称,可选参数,用于指定 slug 属性的名称,默认为 "slug"。
  • slug_url_kwarg:slug URL参数名称,可选参数,用于指定 slug 的 URL 参数名称,默认为 "slug"。
  • pk_url_kwarg:PK URL参数,可选参数,用于指定主键的 URL 参数名称,默认为 "pk"。
  • template_name:模板名称,可选参数,用于指定使用的模板名称。如果未指定,则默认使用 "<app_label>/<model_name>_detail.html" 。例如,如果 model 是 "Blog",则默认情况下将查找 "blog/blog_detail.html"(首先在“templates”目录下查找,然后是在每个应用程序中查找“templates”目录)。你还可以指定一个完整的模板路径,例如:template_name = 'myapp/custom_template.html'。
  • template_engine:模板引擎,可选参数,用于指定要使用的模板引擎。默认为 None。
  • context_object_name:上下文数据名称,可选参数,用于指定视图中使用的上下文对象的名称。默认情况下,上下文对象的名称将根据模型确定,例如,如果模型是"Blog",则上下文对象名称为"blog",如果指定了 context_object_name,则上下文对象名称将使用指定的名称。
  • extra_context:附加数据,可选参数,用于指定附加到上下文的字典数据。
方法
  • get():重写 get() 方法以查找并返回对象的上下文数据。(通常用于获取并呈现详细信息页面)。
  • get_object():获取对象实例。
  • get_queryset():获取查询集。
  • get_context_data():获取视图上下文对象的数据字典。
例子

下面是一个示例 DetailView 使用:

from django.views.generic.detail import DetailView
from .models import Book


class BookDetailView(DetailView):
    model = Book
    template_name = 'book_detail.html'

在这个例子中,我们定义了一个名为 BookDetailView 的 DetailView,它使用 Book 模型作为展示对象,并指定模板名称为 book_detail.html。

接下来,在 urls.py 中配置视图:

from django.urls import path
from .views import BookDetailView


urlpatterns = [
    path('book/<int:pk>/', BookDetailView.as_view(), name='book_detail'),
]

在这个例子中,我们将 BookDetailView 视图作为路径路径的处理函数,并通过对 path() 函数的调用来将其绑定到/book/int:pk/

最后,在模板中使用正确的上下文对象:

<h1>{{ book.title }}</h1>
<p>{{ book.synopsis }}</p>

在这个例子中,我们在模板中使用 book 对象的属性(例如标题和简介)来呈现详细信息。

总结

DetailView 是一个非常有用的 Django 的类视图,它可让我们定制化的展示单个实例的详情信息,并且极大的减少了 HTML 的编写。