【django 学习笔记】10-通用视图

使用通用视图

使用通用视图的方法是在URLconf 文 件中创建配置字典, 然后把这些字典作为URLconf 元组的第三个成员。

from django.conf.urls.defaults import *

from django.views.generic.simple import direct_to_template

urlpatterns = patterns(”,

(r’^about/$’, direct_to_template, {

‘template’: ‘about.html’

})

)

因为通用视图都是标准的视图函数, 我 们可以在我们自己的视图中重用它。

from django.conf.urls.defaults import *

from django.views.generic.simple import direct_to_template

**from mysite.books.views import about_pages**

urlpatterns = patterns(”,

(r’^about/$’, direct_to_template, {

‘template’: ‘about.html’

}),

**(r’^about/(/w+)/$’, about_pages),**

)

接下来, 我们编写 about_pages 视图的代码:

from django.http import Http404

from django.template import TemplateDoesNotExist

from django.views.generic.simple import direct_to_template

def about_pages(request, page):

try:

return direct_to_template(request, template=”about/%s.html” % page)

except TemplateDoesNotExist:

raise Http404()

对象的通用视图

direct_to_template 毫 无疑问是非常有用的,Django 通用视图最有用的地方是呈现数据库中的 数据。

扩展通用视图

制作友好的模板Context

我们可以很容易地像下面这样修改 template_object_name 参数的名称:

from django.conf.urls.defaults import *

from django.views.generic import list_detail

from mysite.books.models import Publisher

publisher_info = {

‘queryset’: Publisher.objects.all(),

‘template_name’: ‘publisher_list_page.html’,

‘template_object_name’: ‘publisher’,

}

urlpatterns = patterns(”,

(r’^publishers/$’, list_detail.object_list, publisher_info)

)

在模板中, 通用视图会通过在template_object_name 后追加 一个_list 的方式来创建一个表示列 表项目的变量名。

添加额外的Context

你常常需要呈现比通用视图提供的更多的额外信息。

所有的通用视图都有一个额外的可选参数 extra_context 。这个参数是一个字典数据类型, 包 含要添加到模板的context 中的额 外的对象。

publisher_info = {

‘queryset’: Publisher.objects.all(),

‘template_object_name’: ‘publisher’,

**’extra_context’: {‘book_list’: Book.objects.all()}**

}

显示对象的子集

举一个简单的例子, 我们打算对书 籍列表按出版日期排序, 最近的排在最前:

book_info = {

‘queryset’: Book.objects.order_by(‘-publication_date’),

}

urlpatterns = patterns(”,

(r’^publishers/$’, list_detail.object_list, publisher_info),

**(r’^books/$’, list_detail.object_list, book_info),**

)

用函数包装来处理复杂的数据过滤

另一个常见的需求是按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_404

from django.views.generic import list_detail

from mysite.books.models import Book, Publisher

def 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}

)

处理额外工作

想象一下我们在 Author 对 象里有一个 last_accessed 字 段, 我们用这个字段来记录最近一次对author 的访问。

首先, 我们需要在URL 配置里设置指向到新的自定义视图:

from mysite.books.views import author_detail

urlpatterns = patterns(”,

# …

**(r’^authors/(?P<author_id>/d+)/$’, author_detail),**

# …

)

接下来写包装函数:

import datetime

from django.shortcuts import get_object_or_404

from django.views.generic import list_detail

from mysite.books.models import Author

def 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值