美文网首页
官方教程#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