当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 通用视图

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:21

数据过滤另一个常见的需求是按URL里的关键字来过滤数据对象。 之前,我们在URLconf中硬编码了出版商的名字,但是如果我们想用一个视图就显示某个任意指定的出版商的所有书籍,那该怎么办呢? 我们可以通过对object_list 通用视图进行包装来避免 写一大堆的手工代码。 按惯例,我们先从写URL配置开始:urlpatterns = patterns('', (r'^publishers/$', list_detail.object_list, publisher_info), (r'^books/(\w+)/$', books_by_publisher),)接下来,我们写 books_by_publisher 这个视图:from django.shortcuts import get_object_or_404from django.views.generic import list_detailfrom mysite.books.models import Book, Publisherdef books_by_publisher(request, name): # Look up the publisher (and raise a 404 if it can't be found). publisher = get_object_or_404(Publisher, name__iexact=name) # Use the object_list view for the heavy lifting. return list_detail.object_list( request, queryset = Book.objects.filter(publisher=publisher), template_name = 'books/books_by_publisher.html', template_object_name = 'book', extra_context = {'publisher': publisher} )这样写没问题,因为通用视图就是Python函数。 和其他的视图函数一样,通用视图也是接受一些 参数并返回HttpResponse 对象。 因此,通过包装通用视图函数可以做更多的事。注意注意在前面这个例子中我们在 extra_context中传递了当前出版商这个参数。处理额外工作我们再来看看最后一个常用模式:想象一下我们在 Author 对象里有一个 last_accessed 字段,我们用这个字段来记录最近一次对author的访问。 当然通用视图 object_detail 并不能处理这个问题,但是我们仍然可以很容易地编写一个自定义的视图来更新这个字段。首先,我们需要在URL配置里设置指向到新的自定义视图:from mysite.books.views import author_detailurlpatterns = patterns('', # ... (r'^authors/(?P<author_id>\d+)/$', author_detail), # ...)接下来写包装函数:import datetimefrom django.shortcuts import get_object_or_404from django.views.generic import list_detailfrom mysite.books.models import Authordef author_detail(request, author_id): # Delegate to the generic view and get an HttpResponse. response = list_detail.object_detail( request, queryset = Author.objects.all(), object_id = author_id, ) # Record the last accessed date. We do this *after* the call # to object_detail(), not before it, so that this won't be called # unless the Author actually exists. (If the author doesn't exist, # object_detail() will raise Http404, and we won't reach this point.) now = datetime.datetime.now() Author.objects.filter(id=author_id).update(last_accessed=now) return response注意除非你添加 last_accessed 字段到你的 Author 模型并创建 books/author_detail.html 模板,否则这段代码不能真正工作。我们可以用同样的方法修改通用视图的返回值。 如果我们想要提供一个供下载用的 纯文本版本的author列表,我们可以用下面这个视图:def author_list_plaintext(request): response = list_detail.object_list( request, queryset = Author.objects.all(), mimetype = 'text/plain', template_name = 'books/author_list.txt' ) response["Content-Disposition"] = "attachment; filename=authors.txt" return response这个方法之所以工作是因为通用视图返回的 HttpResponse 对象可以象一个字典 一样的设置HTTP的头部。 随便说一下,这个 Content-Disposition 的含义是 告诉浏览器下载并保存这个页面,而不是在浏览器中显示它。下一章在这一章我们只讲了Django带的通用视图其中一部分,不过这些方法也适用于其他的 通用视图。 附录C详细地介绍了所有可用的视图,如果你想了解这些强大的特性,推荐你阅读一下。这本书的高级语法部分到此结束。 在下一章, 我们讲解了Django应用的部署。

上一页  [1] [2] [3] 


Django 通用视图