django

Django 1.6 通用视图

有关 Django 1.6 版本的 Generic View

首先有几点需要关注的: 1. 1.6 版本的通用视图是类,需要从 django.views.generic 中派生这个类; 2. 通过这个类的 as_view 方法可以返回一个东西,这个就是复核普通视图类接口的一个函数;

具体看官方文档:generic views documentation

下面详解:

1. 通用视图类的定义

直接搞个原书样例说明问题,稍为看一下接口即可; from django.views import generic from polls.models import Choice, Poll

class IndexView(generic.ListView): template_name = ’polls/index.html’ context_object_name = ’latest_poll_list’

def get_queryset(self):
"""Return the last five published polls."""
    return Poll.objects.order_by(’-pub_date’)[:5]

class DetailView(generic.DetailView):
    model = Poll
    template_name = ’polls/detail.html’

class ResultsView(generic.DetailView):
    model = Poll
    template_name = ’polls/results.html’</code>

2. 通用视图的调用

调用相关通用视图类的 as_view() 方法可以返回一个 view 函数提供给 url 函数(同样是获取一个 request 参数然后返回一个 Response)。

3. 缺省的模板调用

留心一下发现,每个通用视图类里面都指定了一个 template_name 字段来表明所用模板,但是其实这个配置是有默认值的,当缺省的时候: DetailViews: 使用 /_detail.html 查找模板; ListView: 使用 /_list.html 查找模板;

4. 试图理解一下 IndexView

貌似 IndexView 除了指定了一个 template_name 还指定了一个 context_object_name,这是一个放置到 context 里面的命名,在模板中可以通过这个命名获取到列表; 而这个列表的来源则通过重载的 get_queryset 函数获取;

5. 如果希望添加 context 的内容

可以重载 get_context_data 方法来返回一个 context 对象,但为了继承基类的 context,需要用 super 获取 context 然后在上面修改这样来操作。 from django.views.generic import DetailView from books.models import Publisher, Book class PublisherDetail(DetailView): model = Publisher def get_context_data(self, kwargs): # Call the base implementation first to get a context context = super(PublisherDetail, self).get_context_data(kwargs) # Add in a QuerySet of all the books context['book_list'] = Book.objects.all() return context

6. 常用的通用视图列表

  1. base.TemplateView: 指定 template_name,直接渲染一个 template;
  2. base.RedirectView: 指定一个 url,直接重定向至另一个地址;
  3. generic.ListView;
  4. generic.DetailView;

【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2014/03/django-generic-view.html【Django 1.6 通用视图】

发表评论

电子邮件地址不会被公开。 必填项已用*标注