web程序常有的一个功能就是列表展示数据库里的数据,比如前面的章节里,展示所有问题,展示所有投票情况等;基于这种原因,django有自己的通用视图。
下面把投票应用转成通用视图,需要做以下几件事:
- 转换 URLconf。
- 删除一些旧的、不再需要的视图。
- 基于 Django 的通用视图引入新的视图。
首先修改polls/urls.py文件:
urlpatterns = [
# ex:/polls/
path('', views.index, name='index'),
# ex:/polls/5/
path('<int:pk>/', views.detail, name='detail'),
# ex:/polls/5/results/
path('<int:pk>/results/', views.results, name='results'),
# ex:/polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote')
]
注意,第二个和第三个匹配准则中,路径字符串中匹配模式的名称已经由 <question_id> 改为 <pk>
。
其次修改视图:
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls 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):
... # same as above, no changes needed.
至此,就把django由自定义视图换成了通用视图,至于这样做到底有哪些好处,我还不完全清楚,但至少让代码变得更加简洁明了。