Django源码学习-8-ListView&DetailView通用视图
Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
视图负责接受一个 HttpRequest,并返回 HttpResponse 或 抛出异常(Http404)。请求网站页面是get请求,提交表单为post请求,可通过继承View类来自动识别请求,如果为get,自动调用get方法,为post就自动调用POST方法。
代码语言:javascript复制from django.views.generic import ListView
ListView
通过重写queryset, template_name和context_object_name来完成ListView的自定义,还可以通过重写get_context_data方法传递额外的参数或内容。
代码语言:javascript复制context_object_name [get_context_object_name()]
代码语言:javascript复制extra_context
代码语言:javascript复制model
代码语言:javascript复制queryset
用来代替 model, 比如: Publisher.objects.all()[:10]
模板 context 中的变量名会有 object_list, <model_name>_list (publisher_list),拥有相同数据
代码语言:javascript复制ordering
一个字符串或数组,传给 queryset; 相当于:queryset.objects.order_by()
代码语言:javascript复制allow_empty
代码语言:javascript复制paginate_by [get_paginate_by()]
每页的 object 的数量,页数用 request.GET (?page=1) 或 path('<int:page>', PublisherList.as_view()) 指明;
(第一页是: ?page=1, 最后一页是:?page=last)
代码语言:javascript复制paginate_orphans
指明最后一页最多可以有几个 object (正常 溢出)
代码语言:javascript复制template_name [get_template_names()]
代码语言:javascript复制template_name_suffix:默认为 '_list'
代码语言:javascript复制allow_empty
默认为 True (False 表示 object_list 为 空时,显示 404)
代码语言:javascript复制get_context_data()
可以添加额外的模板 context , 默认将 model / queryset 指定的 objects 添加到模板 context
代码语言:javascript复制get_queryset()
默认返回属性 queryset
代码语言:javascript复制from django.views.generic import ListView
class PublisherBookList(ListView):
template_name = 'books/books_by_publisher.html'
def get_queryset(self):
self.publisher = get_object_or_404(Publisher, name=self.kwargs['publisher']) # 根据链接提取除publisher
return Book.objects.filter(publisher=self.publisher) # 筛选出该出版社的所有书籍
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super().get_context_data(**kwargs)
# Add in the publisher
context['publisher'] = self.publisher # 将 publisher 添加到 模板 context
return context