【文件属性】:
文件名称:动态过滤-libmodbus源码解析
文件大小:7.37MB
文件格式:PDF
更新时间:2021-06-24 08:00:43
PDF
10.5动态过滤
另一个常见的需求是根据 URL 中指定的键过滤列表页面中的对象。前面,我们在 URL 配置中硬编码出版社
的名称,但是如果我们想编写一个视图显示随意一家出版社旗下的所有图书呢?
这也很方便,我们可以覆盖 ListView的 get_queryset()方法。它的默认实现是返回 queryset属性的值,不
过我们可以添加更多逻辑。这里的关键是,调用基于类的视图时,很多有用的东西存储到 self中了,除了请
求(self.request)之外,还有根据 URL 配置捕获的位置参数(self.args)和关键字参数
(self.kwargs)。
下述 URL 配置只有一个捕获组:
# urls.py
from django.conf.urls import url
from books.views import PublisherBookList
urlpatterns = [
url(r'^books/([\w-]+)/$', PublisherBookList.as_view()),
]
然后,编写 PublisherBookList视图类:
# views.py
from django.shortcuts import get_object_or_404
from django.views.generic import ListView
from books.models import Book, Publisher
class PublisherBookList(ListView):
template_name = 'books/books_by_publisher.html'
def get_queryset(self):
self.publisher = get_object_or_404(Publisher, name=self.args[0])
return Book.objects.filter(publisher=self.publisher)
可以看出,为查询集合添加逻辑还是相当容易的。如果需要,可以使用 self.request.user通过当前用户过
滤,或者实现其他更复杂的逻辑。与此同时,我们还可以把出版社对象添加到上下文中,供模板使用:
# ...
def get_context_data(self, **kwargs):
# 先调用原来的实现,获取上下文
context = super(PublisherBookList, self).get_context_data(**kwargs)
# 添加出版社对象
context['publisher'] = self.publisher
return context ## 执行额外的操作
下面再介绍一个常见的需求:在调用通用视图前后做些额外工作。假设 Author模型中有个 last_accessed字
段,用于记录这位作者的信息被人查看的最后时间:
# models.py
from django.db import models
10.5 动态过滤 - 153