快捷搜索:
当前位置: 银河手机版app > 银河网投 > 正文

10文档中文版Part2

时间:2019-11-03 05:05来源:银河网投
招待大家访问小编的私人民居房网址《刘江先生的博客和学科》:www.liujiangblog.com 首要分享Python 及Django教程以至有关的博客 先是有的传送门 其三部分传送门 第四片段传送门 3.2 模型和

招待大家访问小编的私人民居房网址《刘江先生的博客和学科》: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 删除模板中硬编码的URLs
  • 2.5.7 UEscortL names的命名空间

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

  • 2.6.1 编写二个轻松易行的form
  • 2.6.2 使用泛型视图:裁减代码冗余

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

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

2.5.1 概览

贰个视图正是叁个网页“类型”,常常提供特定的效果与利益或特定的模版。举例:在二个博客应用中,你恐怕会看出下列视图:

  • 博客主页:展现最新公布的某个剧情
  • 条约详细页面:各个条目款项对应的千古页面
  • 听他们讲年的篇章页面:展现钦命年内的有所博客文章
  • 基于月的稿子页面:突显钦点月内的兼具博客文章
  • 基于天的稿子页面:彰显钦定日内的具有博客小说
  • 表露商议:管理针对某篇博客发布的评说

在我们的投票应用中,大家将创建上面包车型地铁视图:

  • 问卷“index”页:展现最新的有个别问卷
  • 问卷“detail”页面:展现七个问卷的详细文本内容,未有考查结果但是有一个投票或科研表单。
  • 问卷“results”页面:展现有个别问卷的投票或考察结果。
  • 投票动作页面:处理针对某些问卷的有些选项的投票动作。

在Django中,网页和其余的有个别剧情都是透过视图来散发的。视图展现为二个轻巧易行的Python函数(在依赖类的视图中称之为方法卡塔尔国。Django通过比较央浼的U本田CR-VL地址来选取相应的视图。

在你平日的网页上,你或然时时会遇见相仿“ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199梅赛德斯-迈巴赫2D9B65B1B”的url。庆幸的是Django扶植选拔更加的简要介绍的U帕杰罗L格局,而不须求编写制定上边这种复杂的url。

三个U宝马X5L情势其实正是一个U讴歌RDXL通用表明式,举个例子:/newsarchive///。为了使得URAV4L格局映射到相应的视图,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部分,参考后边的章节卡塔尔,它将运转detail()方法,然后在页面中显得你在url里提供的ID。访谈“/polls/34/results/”和“/polls/34/vote/”,将独家显示预约义的伪结果和投票页面。

地点访问的路由进度如下:当有人访问“/polls/34/”地址时,Django将首先加载mysite.urls模块,因为它是settings文件里安装的根UPRADOL配置文件。在该文件里,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]+则是叁个超轻便的原生正则表明式,用于相配意气风发多元接二连三的数字,它非常到的值也正是切实可行要传送的参数值。

装有的U奇骏L形式都以正则表明式,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_DIHighlanderS参数棉被服装置为True。作为惯例,Django也会招来种种在INSTALLED_APPS配置项里注册过的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函数的率先个参数卡塔 尔(阿拉伯语:قطر‎,第4个地方参数是模板,仍然为能够有多少个可选的第三参数---三个字典,包含要求传递给模板的数目。最终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是二个和多少个的分别!卡塔尔国

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 删除模板中硬编码的URAV4Ls

在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视图的UV8 VantageL更改为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之间的U瑞虎L name呢?

答案是使用UMuranoLconf的命名空间。在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奥迪Q5F(具体意思请百度卡塔 尔(英语:State of Qatar)。Django为您提供了贰个简短的方法来防止那几个麻烦,那正是在form表单内增加一条{% csrf_token %}标签,标具名不可校勘,固定格式,地点自便,只假如在form表单内。不过(译者注卡塔 尔(阿拉伯语:قطر‎,那一个法子对form表单的交付情势有利好使,但是假若是用ajax的方法交给数据,那么就很伤脑筋了。个人感到不比直接在Django配置中关闭这一个就好像有作用,其实然并卵的CSQashqaiF得了。

前天,让大家成立一个甩卖提交过来的多少的视图。前边我们已经写了三个“占坑”的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奇骏L。这里有叁个建议,当你成功拍卖POST数据后,应当保证三个卓绝的习于旧贯,始终重回二个HttpResponseRedirect。这不光是对Django来讲,它是二个精粹的WEB开辟习贯。
  • 咱俩在地点HttpResponseRedirect的构造器中选取了叁个reverse()函数。它能支援我们防止在视图函数中硬编码U奥迪Q5L。它首先供给四个咱们在U奥迪Q5Lconf中钦命的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视图的代码非常雷同,有一些冗余,那是贰个程序员不能够经受的。他们都负有雷同的政工逻辑,达成相像的效果:通过从UWranglerL传递过来的参数去数据库查询数据,加载三个模板,利用刚才的数码渲染模板,重返这几个模板。由于这一个历程是那样的无动于衷,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属性正是用来钦命那个模板名的,用于替代自动生成的默许模板名。(译者注:必定要紧凑观望地方的代码,对号落座,注意细节。卡塔 尔(英语:State of Qatar)相近的,在resutls列表视图中,为了内定template_name为'polls/results.html',那样就保险了纵然resulst视图和detail视图相仿一连了DetailView类,使用了同样的model:Qeustion,但它们还是会来得差异的页面。(译者注:模板分裂嘛!so easy!卡塔 尔(英语:State of Qatar)

恍如的,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节。

到此处,本节的内容结束了,你能够起头下一小节的学习。
以为博主翻译的还是能就点赞扶植一下吗!

编辑:银河网投 本文来源:10文档中文版Part2

关键词: