您的位置:澳门新葡萄京最大平台 > 动作小游戏 > 10文档中文版Part2

10文档中文版Part2

发布时间:2019-11-04 03:14编辑:动作小游戏浏览(174)

    应接我们访谈小编的个人网址《刘江(英文名:liú jiāng卡塔尔的博客和课程》:www.liujiangblog.com

    首要分享Python 及Django教程以致有关的博客


    首先片段传送门

    其三有的传送门

    第四部分传送门

    3.2 模型和数据库Models and databases

    3.2.2 查询操作making queries

    3.3.8 会话sessions

    目录

    2.5 第叁个Django app,Part 3:视图和模板

    • 2.5.1 概览
    • 2.5.2 编写越来越多的视图
    • 2.5.3 编写能实际干点活的视图
    • 2.5.4 404错误
    • 2.5.5 使用模板系统
    • 2.5.6 删除模板中硬编码的URubiconLs
    • 2.5.7 UKugaL names的命名空间

    2.6 第三个DJango app,Part 4:表单和泛型视图

    • 2.6.1 编写一个简短的form
    • 2.6.2 使用泛型视图:收缩代码冗余

    2.5 第1个Django app,Part 3:视图和模板

    本章承前启后,首要介绍Django的视图概念。

    2.5.1 概览

    叁个视图正是多个网页“类型”,平时提供特定的成效或一定的模版。举个例子:在一个博客应用中,你恐怕会看出下列视图:

    • 博客主页:展现最新布告的部分内容
    • 条款详细页面:每一个条款对应的万古页面
    • 基于年的小说页面:突显钦点年内的持有博客小说
    • 依据月的篇章页面:显示钦定月内的全体博客小说
    • 基于天的篇章页面:显示钦赐日内的有所博客小说
    • 宣布商酌:管理针对某篇博客发布的评价

    在大家的投票应用中,大家将创造上边包车型地铁视图:

    • 问卷“index”页:突显最新的意气风发部分问卷
    • 问卷“detail”页面:突显一个问卷的详细文本内容,没有考察结果可是有三个投票或考查表单。
    • 问卷“results”页面:呈现有些问卷的投票或考查结果。
    • 投票动作页面:管理针对有些问卷的某些选项的投票动作。

    在Django中,网页和其余的有的剧情都是由此视图来散发的。视图展现为一个简易的Python函数(在依照类的视图中称之为方法卡塔 尔(英语:State of Qatar)。Django通过相比较诉求的U凯雷德L地址来接受相应的视图。

    在你平日的网页上,你或然时时会遇上相同“ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199科鲁兹2D9B65B1B”的url。庆幸的是Django扶助选取越来越简要介绍的UEvoqueL方式,而不供给编写制定上边这种复杂的url。

    四个UXC90L形式其实就是五个URAV4L通用表明式,举例:/newsarchive///。为了使得UWranglerL情势映射到相应的视图,DJango使用U君越Lconfs来产生那意气风发办事。本学科介绍中央的U奥德赛Lconfs使用办法,更加的多的源委,请参照他事他说加以考查6.23节。

    2.5.2 编写越多的视图

    下边,让大家打开polls/views.py文件,输入下列代码:

    polls/views.py

    def detail(request, question_id):
        return HttpResponse("You're looking at question %s." % question_id)
    
    def results(request, question_id):
        response = "You're looking at the results of question %s."
        return HttpResponse(response % question_id)
    
    def vote(request, question_id):
        return HttpResponse("You're voting on question %s." % question_id)
    

    然后,在polls/urls.py文件中踏向上面包车型客车url方式,将其映射到大家地方新增添的视图。

    polls/urls.py

    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        # ex: /polls/
        url(r'^$', views.index, name='index'),
        # ex: /polls/5/
        url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
        # ex: /polls/5/results/
        url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
        # ex: /polls/5/vote/
        url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
    ]
    

    当今去浏览器中做客“/polls/34/”(注意:这里大致了域名。其余,使用了二级路由,url中都要增加polls部分,参考前面的章节卡塔 尔(英语:State of Qatar),它将运维detail()方法,然后在页面中展现你在url里提供的ID。访谈“/polls/34/results/”和“/polls/34/vote/”,将独家突显预订义的伪结果和投票页面。

    地方访问的路由进度如下:当有人访问“/polls/34/”地址时,Django将首先加载mysite.urls模块,因为它是settings文件里设置的根URubiconL配置文件。在该文件里,Django开掘了urlpatterns变量,于是在其内按顺序的开展匹配。当它极度上了^polls/,就脱去url中至极的文本polls/,然后将盈余的文件“34/”,传递给“polls.urls”举办下一步的拍卖。在polls.urls,又非常到了r’^(?P<question_id>[0-9]+)/$’,最后结果正是调用该形式对应的detail()视图,也等于上边的函数:

    detail(request=<HttpRequest object>, question_id='34')
    

    函数中的question_id=’34’参数,是由(?P[0-9]+)而来。在正则表明式中经过二个双圆括号,Django会捕获它极度到的值并传递给相应的视图,作为视图之处参数之一,而?P则表示作者要给这一个捕获的值钦赐一个非同一般的变量名,在视图中得以经过question_id那么些变量名随便的援用它,产生二个重大字参数,不用思谋参数的岗位。至于[0-9]+则是几个十分不难的原生正则表明式,用于相称生龙活虎体系一连的数字,它十分到的值也正是具体要传送的参数值。

    怀有的UENVISIONL情势都以正则表明式,Django不约束你在url情势中的书写情势。然而,你实在没供给书写二个之类的相比较愚昧的含有".html"的形式,它总的来说是没必要,缺乏精炼的:

    url(r'^polls/latest.html$', views.index),
    

    你完全能够用上边包车型大巴格局代表上面包车型地铁:

    url(r'^polls/latest$', views.index),
    

    2.5.3 编写能实际干点活的视图

    近年来大家说过,每种视图最少做两件事之风姿浪漫:重回二个蕴涵呼吁页面的HttpResponse对象只怕弹出二个看似Http404的不得了。此外的则随你便,你爱干嘛干嘛。

    您的视图可以从数据库读取记录,可能不读。你能够应用Django提供的模版系统或然第三方的Python模板系统,或许干脆啥也不用。你可以生成PDF文件、输出XML,创立ZIP压缩文件,任何你想做的事,使用任性你想用的Python库。

    而Django想要的独有HttpResponse或然三个非常。

    因为如此比较轻松,接下去让我们选用DJango自己的数据库API,大家在地方的科目里介绍过的。上边是三个新的index(卡塔尔国视图,它会依赖公布日期突显近些日子的5个投票问卷,通过逗号分隔。

    polls/views.py

    from django.http import HttpResponse
    from .models import Question
    
    def index(request):
        latest_question_list = Question.objects.order_by('-pub_date')[:5]
        output = ', '.join([q.question_text for q in latest_question_list])
        return HttpResponse(output)
    
    # 下面是那些没改动过的视图(detail, results, vote)
    

    而是这里照旧有个难点:在视图中的页面时硬编码的。假设您想校勘页面的显得,就非得纠正这里的Python代码。因而,让我们来接纳Django提供的模版系统,解耦视图和模板之间的关联。

    先是,在polls目录下创办多少个新的templates目录,Django会在它里面查找模板文件。

    那边解释一下:Django项指标settings配置文件中定义了什么加载和渲染模板。暗中认可的设置
    是DjangoTemplates后端,并且APP_DI宝马X5S参数被装置为True。作为惯例,Django也会招来种种在INSTALLED_应用程式S配置项里注册过的app本人目录下的templates子目录。

    重回你刚才创制的templates目录中,再次创下制二个新的子目录名称叫polls,走入该子目录,成立三个新的html文件index.html。换句话说,你的模版文件应当是polls/templates/polls/index.html。依据上边的表明,你今后得以在DJango中央直属机关接行使polls/index.html引用该文件了。

    模板命名空间:
    你也许会想,为什么不把模板文件直接放在polls/templates目录下,而是费劲的再建个子目录polls呢?设想这么个情况,有另外一个app,它也有一个名叫index.html的文件,当Django在搜索模板时,有可能就找到它,然后退出搜索,这就命中了错误的目标,不是我们想要的结果。解决这个问题的最好办法就是在templates目录下再建立一个与app同名的子目录,将自己所属的模板都放到里面,从而达到独立命名空间的作用,不会再出现引用错误。
    

    到现在,将下列代码写入文件:
    polls/templates/polls/index.html

    {% if latest_question_list %}
        <ul>
        {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
        {% endfor %}
        </ul>
    {% else %}
        <p>No polls are available.</p>
    {% endif %}
    

    再正是,改正视图像和文字件,让新的index.html文件生效:
    polls/views.py

    from django.http import HttpResponse
    from django.template import loader
    from .models import Question
    
    def index(request):
        latest_question_list = Question.objects.order_by('-pub_date')[:5]
        template = loader.get_template('polls/index.html')
        context = {
        'latest_question_list': latest_question_list,
        }
        return HttpResponse(template.render(context, request))
    

    地点的代码会加载polls?index.html文件,并传递给它二个参数,这几个参数是一个字典,包含了模版变量名和python对象时期的照耀关系。

    在浏览器中通过探访“/polls/”,你能够看看叁个列表,满含“What’s up”的问卷,以至连接到其对应详细内容页面包车型客车链接点。

    急速情势:render()

    在实际上利用中,加载模板、传递参数,重返HttpResponse对象是一条龙再常用可是的操作了,为了省去力气,Django提供了叁个急忙方式:render函数,一步到位!看如下代码:

    polls/views.py

    from django.shortcuts import render
    from .models import Question
    def index(request):
        latest_question_list = Question.objects.order_by('-pub_date')[:5]
        context = {'latest_question_list': latest_question_list}
        return render(request, 'polls/index.html', context)
    

    render()函数的首先个职位参数是号召对象(正是view函数的第一个参数卡塔尔国,第一个职责参数是模板,仍可以有一个可选的第三参数---多个字典,包罗必要传递给模板的多少。最后render函数再次回到叁个通过字典数据渲染过的模板封装而成的HttpResponse对象。

    2.5.4 404错误

    目前让我们来编排再次回到具体问卷文本内容的视图:

    polls/views.py

    from django.http import Http404
    from django.shortcuts import render
    from .models import Question
    # ...
    def detail(request, question_id):
        try:
            question = Question.objects.get(pk=question_id)
        except Question.DoesNotExist:
            raise Http404("Question does not exist")
        return render(request, 'polls/detail.html', {'question': question})
    

    这里有个新定义:如果哀告的问卷ID荒诞不经,那么会弹出叁个Http404不当。

    稍后大家商谈谈你应有在polls/detail.html里面写点什么代码,然而未来你能够大约的先写这么个东西,用来展现方面包车型地铁404不当:

    polls/templates/polls/detail.html

    {{ question }}
    

    急忙情势:get_object_or_404()

    如同render函数同样,Django相像为你提供了三个偷懒的方法,代替上边的多行代码,那正是get_object_or_404()方法,参考上边包车型的士代码:

    polls/views.py

    from django.shortcuts import get_object_or_404, render
    from .models import Question
    # ...
    def detail(request, question_id):
        question = get_object_or_404(Question, pk=question_id)
        return render(request, 'polls/detail.html', {'question': question})
    

    别讲笔者没提示您,和render同样,也须要在Django内置的火速格局模块中程导弹入get_object_or_404()!

    get_object_or_404()函数将贰个Django模型作为第叁个任务参数,前边能够跟上自由个数的主要字参数(python函数参数的分类和语法一定要搞明白了!那么些根本字参数是传递给模型微电脑的get()函数的,在前边会讲到。卡塔 尔(阿拉伯语:قطر‎,借使目的不设有则弹出Http404乖谬。

    理念:
    为什么要费劲的使用一个get_object_or_404()快捷方式,而不是让系统自动的捕获ObjectDoesNotExist异常或者弹出模型API的Http404异常?仅仅只是为了少写点代码?
    因为后两者会耦合模型层和视图层。Django的一个非常重要的设计目标是维持各层级之间的松耦合。更多的内容请参考3.3.5节。
    

    黄金时代致,这里还恐怕有三个get_list_or_404()函数,和方面包车型客车get_object_or_404()雷同,只然而是用来顶替filter()函数,当查问列表为空时弹出404谬误。(filter是模型API中用来过滤查询结果的函数,它的结果是二个列表集。而get则是询问叁个结果的法子,和filter是五个和多少个的界别!卡塔 尔(英语:State of Qatar)

    2.5.5 使用模板系统

    回去detail()视图。将上下文变量question传递给相应的html模板,它看起来如下所示:

    polls/templates/polls/detail.html

    <h1>{{ question.question_text }}</h1>
    <ul>
    {% for choice in question.choice_set.all %}
        <li>{{ choice.choice_text }}</li>
    {% endfor %}
    </ul>
    

    前方大家说过了,在模板系统中圆点“.”是万能的法力师,你可以用它访谈对象的天性。在例子{{ question.question_text }}中,DJango首先会在question对象中品尝搜索二个字典,假使退步,则尝试寻觅属性,假如再退步,则尝试作为列表的目录进行询问。

    在 {% for %} 循环中的方法调用——poll.choice_set.all其实正是Python的代码poll.choice_set.all(),它将赶回豆蔻梢头组可迭代的 Choice 对象,并用在 {% for %} 标签中。

    越多内容请查看3.5节的沙盘向导!

    2.5.6 删除模板中硬编码的U奥迪Q3Ls

    在polls/index.html文件中,还只怕有部分硬编码存在,也正是herf里的“/polls/”部分:

    <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    

    其间的紧耦合对于代码更改非常不利于。 不过,大家眼前给urls定义了四个name别名,能够用它来顶替。具体代码如下:

    <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
    

    Django会在polls.urls文件中搜索name='detail'的url,具体的就是底下那行:

    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    

    举个栗子,要是你想将polls的detail视图的U路虎极光L改造为polls/specifics/12/,那么你不必要在模板中重复修正url地址了,仅仅只供给在polls/urls.py文件中,将相应的正则表达式改成下边那样的就能够了:

    # 添加新的单词'specifics'
    url(r'^specifics/(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    

    2.5.7 U奇骏L names的命名空间

    本课程例子中,唯有1个app也便是polls,可是在现实中很明显会有5个、13个、更加多的app同不经常间存在五个门类中。Django是什么区分那几个app之间的UTiggoL name呢?

    答案是选择UCRUISERLconf的命名空间。在polls/urls.py文件的上马部分,增加二个app_name的变量来钦赐该使用的命名空间:

    polls/urls.py

    from django.conf.urls import url
    from . import views
    
    app_name = 'polls'
    urlpatterns = [
        url(r'^$', views.index, name='index'),
        url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
        url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
        url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
    ]
    

    至今,让我们将代码修正得更谨严一点,将上面包车型客车:
    polls/templates/polls/index.html

    <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
    

    修改为:

    <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
    

    留意引用方法是引号并不是圆点亦非斜杠!!!!!!!!!!!!

    到此,大家得以步向下部分的学科了。

    2.6 第三个DJango app,Part 4:表单和泛型视图

    本有的关键介绍form表单相关。

    2.6.1 编写多个轻易的form

    当今在大家原先的polls/detail.html文件中加多二个表单成分:

    polls/templates/polls/detail.html

    <h1>{{ question.question_text }}</h1>
    
    {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
    
    <form action="{% url 'polls:vote' question.id %}" method="post">
    {% csrf_token %}
    {% for choice in question.choice_set.all %}
        <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
        <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
    {% endfor %}
    <input type="submit" value="Vote" />
    </form>
    

    简短表达:

    • 地方的模板展现一四种单选按键,按键的值是选取的ID,开关的名字是字符串"choice"。那表示,当你筛选了中间有个别开关,并付出表单,二个包蕴数据choice=#的POST央浼将被发送到钦赐的url,#是被增选的挑精拣肥的ID。那正是HTML表单的基本概念。
    • 只要您有早晚的前端开垦功底,那么form标签的action属性和method属性你应有很理解它们的意义,action表示你要发送的目标url,method表示提交数据的方式,日常分POST和GET,越来越多的解说就不是本教程干的事情了,你须求补课。
    • forloop.counter是DJango模板系统管理特意提供的三个变量,用来代表你近来循环的次数,平常用来给循环项目增进有序数标。
    • 出于大家发送了叁个POST哀告,就亟须思谋一个跨站央浼杜撰的标题,简单称谓CS宝马X5F(具体意思请百度卡塔 尔(英语:State of Qatar)。Django为您提供了贰个简练的秘籍来幸免那么些烦闷,那就是在form表单内增多一条{% csrf_token %}标签,标签字不可校订,固定格式,地方任意,只假诺在form表单内。不过(译者注卡塔尔,这么些法子对form表单的付出方式有利好使,但是借使是用ajax的方法提交数据,那么就很费事了。个人感觉不比直接在Django配置中关闭这些近乎有意义,其实然并卵的CS奇骏F得了。

    现行反革命,让我们创建一个管理提交过来的多寡的视图。后面我们已经写了三个“占坑”的vote视图的url:
    polls/urls.py

    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
    

    以致“占坑”的vote视图函数,我们把坑填起来:
    polls/views.py

    from django.shortcuts import get_object_or_404, render
    from django.http import HttpResponseRedirect, HttpResponse
    from django.urls import reverse
    from .models import Choice, Question
    # ...
    
    def vote(request, question_id):
        question = get_object_or_404(Question, pk=question_id)
        try:
            selected_choice = question.choice_set.get(pk=request.POST['choice'])
        except (KeyError, Choice.DoesNotExist):
            # 发生choice未找到异常时,重新返回表单页面,并给出提示信息
            return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
            })
        else:
            selected_choice.votes += 1
            selected_choice.save()
            # 成功处理数据后,自动跳转到结果页面,防止用户连续多次提交。
            return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
    

    稍加新的东西,大家要解释一下:

    • request.POST是三个好像字典的靶子,允许你通过键名访谈提交的数目。本例中,request.POST[’choice’]回来被增选选项的ID,何况值的种类永世是string字符串,那怕它看起来像数字,记住了!!!!相似的,你也足以用相通的一手拿到GET乞请发送过来的多寡,一个道理。
    • request.POST[’choice’]有望接触八个KeyError十分,假使您的POST数据里从未提供choice键值,在这里种景观下,上边的代码会回来表单页面并付出错误提醒。译者注:常常大家会给个默许值,幸免这种相当的产生,举个例子:request.POST[’choice’,None],多少个None排除所不正常。
    • 在甄选计数器加生机勃勃后,再次回到的是贰个HttpResponseRedirect实际不是原先大家常用的HttpResponse。HttpResponseRedirect要求多个参数:重定向的U奥迪Q7L。这里有三个提议,当你成功拍卖POST数据后,应当保持一个安然照旧的习惯,始终再次来到贰个HttpResponseRedirect。那不独有是对Django来讲,它是二个非凡的WEB开采习贯。
    • 我们在上头HttpResponseRedirect的构造器中应用了二个reverse()函数。它能协助大家防止在视图函数中硬编码U哈弗L。它首先必要多少个大家在U凯雷德Lconf中钦定的name,然后是传递的数据。举个例子'/polls/3/results/',此中的3是有个别question.id的值。重定向后将步向'polls:results'对应的视图,并将question.id传递给它。白话来说,正是把活扔给其它叁个路由对应的视图去干。

    当有人对某些难点投票后,vote()视图重定向到了问卷的结果彰显页面。上面大家来写那几个管理结果页面包车型客车视图:
    polls/views.py

    from django.shortcuts import get_object_or_404, render
    
    def results(request, question_id):
        question = get_object_or_404(Question, pk=question_id)
        return render(request, 'polls/results.html', {'question': question})
    

    平等,还须求写个模板。(译者注:路由、视图、模板、模型!你必要的套路....卡塔尔

    polls/templates/polls/results.html

    <h1>{{ question.question_text }}</h1>
    <ul>
    {% for choice in question.choice_set.all %}
        <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
    {% endfor %}
    </ul>
    <a href="{% url 'polls:detail' question.id %}">Vote again?</a>
    

    现今您可以取浏览器中拜谒/polls/1/了,投票吧。你走访到四个结果页面,每投三回,它的剧情就更新三次。借使您付出的时候从不采取种类,则会赢得八个不当提醒。

    注释:(怎么这么多注释....)
    在上面的vote视图中的代码存在一点小问题。如果有2个用户同时在对某项进行提交时,很有可能发生同时对数据库进行读写的情况,它有可能导致数据的不协调,也就是所谓的“竞态”,如果你感兴趣,可以参考6.15节相关的通过使用F()查询来避免竞态的讨论和介绍。
    

    2.6.2 使用泛型视图:减少代码冗余

    动作小游戏,上边包车型客车detail、index和results视图的代码特别相近,有一点点冗余,那是二个技师不能够忍受的。他们都存有相同的作业逻辑,实现近似的效劳:通过从UCRUISERL传递过来的参数去数据库查询数据,加载一个模板,利用刚才的数量渲染模板,再次回到这几个模板。由于那一个历程是如此的宽泛,Django又很知情达理的帮你想方法偷懒了,它提供了黄金时代种火速方式,名称为“泛型视图”系统。

    近年来,让大家来试试看看将原来的代码改为使用泛型视图的不二秘诀,整个经过分三步走:

    • 改变URLconf
    • 删除一些旧的无效的视图
    • 动用基于泛型视图的新视图

    注释:Django官方的“辩解”
    怎么本学科的代码来回改造这么频仍?
    答:平时在写三个Django的app时,大家生机勃勃开头将在调整是应用泛型视图依然不要,实际不是等到代码写到四分之二了才重构你的代码成泛型视图。可是本课程为了令你清晰的敞亮视图的内涵,“故意”走了一条相比2的路,因为大家的经济学是:在你使用总结器在此以前您得先清楚基本的数学公式。

    修改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'),
        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'),
    ]
    

    请介意:在上头的的第2,3条约准将原来的<question_id>校正成了<pk>.

    矫正视图

    接下去,展开polls/views.py文件,删掉index、detail和results视图,替换到Django的泛型视图,如下所示:

    polls/views.py

    from django.shortcuts import get_object_or_404, render
    from django.http import HttpResponseRedirect
    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):
        """返回最近发布的5个问卷."""
            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):
    ... # 这个视图未改变!!!
    

    在那地,大家采用了二种泛型视图:ListView和DetailView(译者注:它们是作为父类被接二连三的卡塔尔国。那二者分别表示“展现二个对象的列表”和“突显特定类型对象的详实页面”的抽象概念。

    • 每豆蔻年华种泛型视图都需求明白它要效果与利益在哪些模型上,那通过model属性提供。

    • DetailView泛型视图须求从URL捕获到的叫做"pk"的主键值,由此大家在url文件上将2和3条指标<question_id>修改成了<pk>

    默许意况下,DetailView泛型视图使用一个叫做<app name>/<model name>_detail.html的模版。在本例中,实际接纳的是"polls/question_detail.html"。template_name属性便是用来钦点这么些模板名的,用于代替自动生成的暗许模板名。(译者注:一定要留神考察地点的代码,对号落座,注意细节。卡塔 尔(阿拉伯语:قطر‎同样的,在resutls列表视图中,为了钦定template_name为'polls/results.html',那样就确认保障了就算resulst视图和detail视图相符世袭了DetailView类,使用了同生龙活虎的model:Qeustion,但它们照旧会来得差异的页面。(译者注:模板分裂嘛!so easy!卡塔尔

    就好像的,ListView泛型视图使用二个默许模板称为<app name>/<model name>_list.html。我们也应用template_name这几个变量来报告ListView使用大家已经存在的
    "polls/index.html"模板,实际不是行使它协和暗中认可的不得了。

    在课程的前面部分,大家给模板提供了四个带有question和latest_question_list的上下文变量。而对此DetailView,question变量会被机关提供,因为我们选取了Django的模型(Question卡塔 尔(阿拉伯语:قطر‎,Django会智能的采纳适宜的上下文变量。然则,对于ListView,自动生成的上下文变量是question_list。为了掩没它,大家提供了context_object_name属性,钦点说笔者们期望采用latest_question_list而不是question_list。

    近来你能够运营开垦服务器,然后试试基于泛型视图的应用程序了。
    翻开更加多关于泛型视图的剧情,请前往3.6节。

    到那边,本节的剧情甘休了,你可以起始下一小节的上学。
    认为博主翻译的还足以就打call援助一下吧!

    本文由澳门新葡萄京最大平台发布于动作小游戏,转载请注明出处:10文档中文版Part2

    关键词:

上一篇:附属产物

下一篇:没有了