Django源码学习-8-ListView 通用视图-续

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 = &#39;books/books_by_publisher.html&#39;

def get_queryset(self):
    self.publisher = get_object_or_404(Publisher, name=self.kwargs[&#39;publisher&#39;]) # 根据链接提取除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[&#39;publisher&#39;] = self.publisher  # 将 publisher 添加到 模板 context
    return context</code></pre></div></div>