detail()、results()、index()等视图函数具有类似的结构:
- 根据URL传入的参数从数据库中获得相应的数据
- 加载模板,并在模板中使用这些数据
因此Django提供了一个“视图生成(generic views)”系统以简化视图函数的编写
Generic views abstract common patterns to the point where you don’t even need to write Python code to write an app.
通过以下几个步骤将polls应用变成视图生成系统
- 修改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'),
# 将传入views中的参数由question_id变成pk
# url()函数的第二个参数形式也发生的改变(因为此时views.py中是以视图类的形式编写的)
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'),
]
- 修改views
# polls/views.py
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.urls import reverse
# 为了使用视图生成系统,需要从Django中导入generic模块
from django.views import generic
from .models import Choice, Question
# 继承generic.ListView类,表示最终展示的是一个列表视图
class IndexView(generic.ListView):
# 默认情况下(即不使用template_name属性时),ListView视图生成类回去搜索名叫'<app name>/<model name>_list.html'的模板
template_name = 'polls/index.html'
# ListView视图生成类,Django会根据使用的数据模型(如Question)自动生成环境变量(如question_list)
# 如果不希望使用自动生成的环境变量,可以显式的使用context_object_name属性指定环境变量名(亦适用于DetailView视图生成类)
context_object_name = 'latest_question_list'
# 环境变量保存的对象
def get_queryset(self):
"""Return the last five published questions."""
return Question.objects.order_by('-pub_date')[:5]
# 继承generic.DetailView类,表示最终展示的是一个内容细节视图
# 对于DetailView视图生成类,Django会根据所使用的数据模型(如Qustion)自动生成合适的环境变量(如question)以保存获取的数据
class DetailView(generic.DetailView):
# model属性告诉Django该视图生成中使用的数据模型
# DetailView需要从URL中获取主键(pk)的信息,因此在URLconf中将传入参数由question_id变为pk
model = Question
# 默认情况下,DetailView视图生成类回去搜索名叫'<app name>/<model name>_detail.html'的模板
# 为了为不同的DetailView视图生成类指定不同的模板,使用template_name属性显式地指定
template_name = 'polls/detail.html'
class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'
def vote(request, question_id):
... # same as above, no changes needed.
-
视图生成系统自动做的事:
- 自动从URL中获取pk参数作为主键
- 自动生成环境变量名(如使用Question数据模型)
- ListView中:question_list
- DetailView中:question
- 自动搜寻模板(如对于polls应用中使用Question数据模型的视图生成类)
- ListView:polls/question_list.html
- DetailView:polls/question_detail.html