美文网首页
官方教程#4-2-使用Django的视图生成

官方教程#4-2-使用Django的视图生成

作者: wangfp | 来源:发表于2017-09-15 11:45 被阅读0次

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

相关文章

网友评论

      本文标题:官方教程#4-2-使用Django的视图生成

      本文链接:https://www.haomeiwen.com/subject/nzrssxtx.html