[译]Django first steps Part4

2 使用generic views: 更少代码

像前面提到的detail() 和results() views 非常简单,还有index()view,这些 views 是通常Web 开发模式:从数据库中得到数据,通过url加载模板并渲染模板。因为这种模式太寻常了,django又给大家提供了快捷方式:“generic views” 系统;

下面把我们的polls应用转变为generic views系统,我们需要删除一大推代码,分成下面几步:

  • 转换URLconf

  • 删除一些老的,没用的views

  • 来一些Django’s generic views

为什么把代码搞来搞去?

通常的,当写一个Django app, 你需要先评估generic views 是否适合解决你的问题, 从开始就使用它们要比中间再改来的好。但在我们的例子中是为了让你了解核心思想,就像在你使用计算器之前你要先学会基本运算。

修改URLconf

打开polls/urls.py并修改它:

from django.conf.urls import url
from . import views

app_name = 'polls'
urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

我们注意到将原来的<question_id> 改成了 <pk>

修改views

删除原来老的index, detail, and results三个views,使用新的generic views来代替:

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.views import generic

from .models import Choice, Question


class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        """Return the last five published questions."""
        return Question.objects.order_by('-pub_date')[:5]


class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'


class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'

def vote(request,question_id):
    ...

我们使用了两个generic views: ListView and DetailView. 分别表示 “display a list of objects” 和“display a detail page for a particular type of object.”。

  • 每个generic view需要知道它所对应的models名称

  • DetailView从url中的pk参数获取主键值,所以我们已经在url中将question_id改成了pk了。

在默认情况下, DetailView generic view 将会使用一个叫做/_detail.html的template文件,在我们的例子中,它使用"polls/question_detail.html"。template_name 可以指定template的名称。

相似的情况, the ListView generic view 使用默认模板文件/_list.html;我们使用 template_name 来告诉ListView我们已经存在的"polls/index.html" template。

在上节中,我们的模板文件中有 question 和latest_question_list这种变量. 在DetailView 中 ,一旦我们使用django model,question 变量能够自动提供 Django会自动提供一个合适的环境变量名称。 然而, 对于ListView自动生成如question_list的变量名称。使用指定context_object_name变量,我们也能够自定义变量名称。我们可以在tempalte中将就django的自动产生变量,但是使用我们自己定义的变量更加容易。

运行服务器,就能看到基于generic views的应用了,要详细了解generic views自己看文档。当你熟悉了 forms and generic views后,可以参看part 5查看如何测试django应用。

posted @ 2016-06-07 11:15  felo  阅读(233)  评论(0编辑  收藏  举报