Django之第一个app<17>
2015-08-30 20:54
253 查看
使用类视图:更少的代码更好
以上提到的,
这些视图代表了一种常见的基本web开发:通过URL中传递的参数来从数据库中获取数据,加载一个模版,然后返回渲染好的模版。因为这非常常见,所以Django提供了一个捷径,叫做
类视图抽取常见的模式来达到你甚至不需要写python代码就能写一个app的效果。
让我们来将我们的投票应用转换为类视图系统,所以我们可以删除一些我们自己的代码。我们只需完成几个步骤来达到那个目的:
转换
删除一些老的、不需要的视图
引入建立在Django类视图上一些新的视图
修改
首先,打开
修改视图
下面,我们打算移除我们之前写的
这里,我们使用两个类视图:
每个类视图需要知道它关联哪个模型,这可以通过
默认,
以上提到的,
detail()和
results()视图是非常简单的,
index(),展示了一系列投票,也是类似的。
这些视图代表了一种常见的基本web开发:通过URL中传递的参数来从数据库中获取数据,加载一个模版,然后返回渲染好的模版。因为这非常常见,所以Django提供了一个捷径,叫做
"类视图"系统。
类视图抽取常见的模式来达到你甚至不需要写python代码就能写一个app的效果。
让我们来将我们的投票应用转换为类视图系统,所以我们可以删除一些我们自己的代码。我们只需完成几个步骤来达到那个目的:
转换
URLconf
删除一些老的、不需要的视图
引入建立在Django类视图上一些新的视图
修改
URLconf
首先,打开
polls/urls.py的
URLconf,改变成这样:
from django.conf.urls import url from . import views urlpatterns=[ url(r'^$',views.IndexView.as_view(),name='index'), url(r'^(?P<pk>[0-9]+)/$',views.DetailView.as_view(),name='detail'), url(r'^(?P<question_id>[0-9]+)/results/$',views.ResultView.as_view(),name='results'), url(r'^(?P<pk>[0-9]+)/vote/$',views.vote,name='vote'), ]
修改视图
下面,我们打算移除我们之前写的
index、
detail和
results视图,而是使用Django的类视图。打开
polls/views.py
from django.shortcuts import render,get_object_or_404 from django.http import HttpResponse,HttpResponseRedirect,Http404 from django.template import RequestContext,loader from .models import Question,Choice from django.core.urlresolvers import reverse from django.views import generic # Create your views here. class IndexView(generic.ListView): template_name='polls/index.html' context_object_name='latest_question_list' def get_queryset(Self): return Question.objects.order_by('-pub_date')[:5] class DetailView(generic.DetailView): model=Question template_name='polls/detail.html' class ResultView(generic.DetailView): model=Question template_name='polls/results.html'
这里,我们使用两个类视图:
ListView和
DetailView,这两个视图分别是从
"展示一系列物体"和
"展示一个特定类型物体的详情页"。
每个类视图需要知道它关联哪个模型,这可以通过
model属性来提供
DetailView类视图希望从URL中捕获的主键值叫做
pk,所以我们将
question_id改变为
pk。
默认,
DetailView类视图使用一个模版,叫做
<app name>/<model name>_detail.name,在我们这个例子中,它将使用
polls/question_detail.html这个模版。
template_name这个属性被用来告诉Django要使用一个特定的模版,而不是自动产生一个默认的模版名。我们也为
results列表视图声明
template_name,这确保
results视图和
detail视图有不同的外观,尽管都是一个
DetailView。
相关文章推荐
- Unity3D有限状态机(FSM)学习笔记【6】Dispatcher类
- 卸载win10内置windows app的方法
- 基于cordova的 百度混音插件 iOS版
- iOS常用设计模式——原型模式
- Android控件之TimePickerDialog、DatePickerDialog和自定义DialogPopupWindow与NotificationManager
- Unity3D有限状态机(FSM)学习笔记【5】FSEvent类
- iOS阶段学习第35天笔记(Touch手势介绍)
- Unity3D有限状态机(FSM)学习笔记【4】FiniteStateMachine类
- ios开发之 - xcode 快捷键
- Unity3D有限状态机(FSM)学习笔记【3】FSState类
- CodeForces 549G Happy Line
- Android线程的相关使用
- Android开发详解之onTouch和onClick详解
- android-屏幕适配(一)
- Unity3D有限状态机(FSM)学习笔记【2】IState
- android判断外存储卡是否安装并新建文件夹
- Android源码解析--超好看的下拉刷新动画
- Android之测试前期那点事
- Unity3D有限状态机(FSM)学习笔记【1】有限状态机总述
- Android中的音频播放(MediaPlayer和SoundPool)