2017, 世界发生了什么样?

by admin on 2019年3月15日

迎接我们访问作者的村办网站《刘江(Liu Jiang)的博客和课程》:www.liujiangblog.com

2017 年,365 天,世界的角落,发生着您驾驭或不知情的事。

重在分享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 删除模板中硬编码的UCR-VLs
  • 2.5.7 U大切诺基L names的命名空间

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

  • 2.6.1 编写一个简单易行的form
  • 2.6.2 使用泛型视图:缩小代码冗余

你曾与客人爆发强烈的共鸣,或忧虑,或欢愉,或愤怒,或迫不得已……你与世界的关系,让您变成了您。 正如John·多恩所写:「没有人是一座孤岛,能够自全。每种人都以大陆的一片,全体的一有个别。各样人的物化都使小编忧伤,因为笔者是全人类的一员。」 

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

本章承上启下,主要介绍Django的视图概念。

看看啊,大家的二零一七。

2.5.1 概览

多少个视图正是一个网页“类型”,经常提供一定的遵从或特定的沙盘。例如:在一个博客应用中,你只怕会看到下列视图:

  • 博客主页:呈现最新发表的一部分剧情
  • 条目详细页面:每种条目对应的永远页面
  • 基于年的稿子页面:显示钦点年内的具有博客作品
  • 根据月的稿子页面:彰显钦命月内的具备博客文章
  • 根据天的小说页面:展现钦定日内的有着博客作品
  • 颁发评论:处理针对某篇博客公布的评说

在我们的投票应用中,大家将建立上边的视图:

  • 问卷“index”页:显示最新的有的问卷
  • 问卷“detail”页面:突显七个问卷的详尽文本内容,没有调查结果不过有三个投票或检察表单。
  • 问卷“results”页面:呈现某些问卷的投票或调查结果。
  • 投票动作页面:处理针对有个别问卷的某部选项的投票动作。

在Django中,网页和别的的有个别剧情都以透过视图来散发的。视图凸显为二个不难易行的Python函数(在依照类的视图中称之为方法)。Django通过相比请求的U安德拉L地址来采纳相应的视图。

在你日常的网页上,你只怕时时会遇见类似“ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199Sylphy2D9B65B1B”的url。庆幸的是Django支持选取越来越简介的U路虎极光L形式,而不供给编写制定上边那种复杂的url。

三个U奥迪Q7L格局其实便是二个UQashqaiL通用表达式,例如:/newsarchive///。为了使得U大切诺基L情势映射到对应的视图,DJango使用U奔驰M级Lconfs来实现这一办事。本学科介绍焦点的URAV4Lconfs使用办法,更加多的剧情,请参见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文件里设置的根U昂CoraL配置文件。在该公文里,Django发现了urlpatterns变量,于是在其内按顺序的进展匹配。当它十二分上了^polls/,就脱去url中匹配的文本polls/,然后将剩余的文书“34/”,传递给“polls.urls”进行下一步的拍卖。在polls.urls,又11分到了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奥迪Q3L情势都是正则表达式,Django不限制你在url格局中的书写形式。可是,你真正没需求书写3个之类的比较愚昧的涵盖”.html”的方式,它分明是没须求,不够精炼的:

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

您一点一滴能够用上面包车型大巴形式代表上边的:

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

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

前方我们说过,各类视图至少做两件事之一:再次回到1个暗含呼吁页面包车型客车HttpResponse对象只怕弹出二个看似Http404的可怜。别的的则随你便,你爱干嘛干嘛。

你的视图能够从数据库读取记录,只怕不读。你能够采用Django提供的模板系统大概第②方的Python模板系统,可能干脆啥也不用。你能够生成PDF文件、输出XML,成立ZIP压缩文件,任何你想做的事,使用任意你想用的Python库。

而Django想要的唯有HttpResponse大概一个不行。

因为如此很轻便,接下去让大家接纳DJango自个儿的数据库API,大家在上面的学科里介绍过的。上边是3个新的index()视图,它会基于发布日期展现近来的伍个投票问卷,通过逗号分隔。

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目录下创办1个新的templates目录,Django会在它里面查找模板文件。

此地解释一下:Django项指标settings配置文件中定义了何等加载和渲染模板。暗中认可的安装
是DjangoTemplates后端,并且APP_DI昂科拉S参数被设置为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文件,并传递给它1个参数,那些参数是二个字典,包括了模版变量名和python对象时期的照耀关系。

在浏览器中经过访问“/polls/”,你能够看出1个列表,包罗“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函数的率先个参数),第3个职位参数是模板,还足以有三个可选的第2参数—三个字典,包涵须要传递给模板的数目。最终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同样为您提供了3个偷懒的不二法门,替代上面包车型地铁多行代码,那正是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节。

平等,那里还有3个get_list_or_404()函数,和地点的get_object_or_404()类似,只可是是用来替代filter()函数,当查问列表为空时弹出404荒唐。(filter是模型API中用来过滤查询结果的函数,它的结果是八个列表集。而get则是查询二个结出的措施,和filter是3个和多少个的区分!)

January

© Kyodo/Reuters

十一月二二十日,扶桑名取。

人人在坡地上看出 2017 年的第三次日出。

© Dimitar Dilkoff/AFP

11月十七日,伊拉克大连。

伊拉克战士与伊斯兰国配备应战时期,汽车炸弹爆炸后的浓烟升向天空。

© Zigniew Bzdak/Zuma

5月一日,美利坚合众国芝加哥。

奥巴马在孟买公布告别解说,回想了祥和的八年总统路。

© Shizuo Kambayashi/AP

四月1日,东京(Tokyo)。

东瀛 APA 宾馆内停放“否认德班杀戮”书籍的轩然大波引发关切。该书由 APA 集团首席执行官、右翼援救者元谷外志雄撰写,书中否认了大韩民国、朝鲜慰安妇,及圣Jose杀戮的野史。酒馆到现在未撤下该书。

© Lam Yik Fei/Getty

1十二月213日,中华人民共和国香江。

城里人购销年货,迎接新春佳节。

© Andrzej Grygiel/EPA

7月2215日,波兰共和国(The Republic of Poland)奥斯维辛。

国际大屠杀纪念日,幸存者参加奥斯维辛集中营解放 72 周年纪念活动。

© Laura Buckman/Reuters

7月125日,美利坚合众国埃及开罗。

Trump 2十十17日签名“禁穆令”,限制多国穆斯林入境。三月31日,美最高法察院经投票同意修订后的“禁穆令”生效。图为穆斯林在奥斯陆-沃思堡国际机场祷告。

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

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

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

其间的紧耦合对于代码修改10分不利于。
然而,我们近期给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福特ExplorerL更换为polls/specifics/12/,那么你不须要在模板中重新修改url地址了,仅仅只必要在polls/urls.py文件中,将相应的正则表明式改成上面那样的就行了:

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

February

© Ueslei Marcelino/Reuters

三月6日,巴西帕拉伊巴。

阿妈抱着患有头小畸形症的十三个月大的双胞胎外孙女。德意志研商人口已证实早前虐待的寨卡病毒感染与小头症发病存在关联,但仍不驾驭病毒怎样影响胚胎尾部发育。

© Ishara S. Kodikara/AFP

11月二八日,危地马拉佩罗尼亚。

一名僧人向古庙进献了一条藏红花有色纺织物。

© Pam Voth/NG

十月10日,加拿大安大略省。

在三沙尔顿的鸸鹋农场,三头鸸鹋婴孩破壳而出。

© Billy H.C. Kwok/Bloomberg

5月二十七日,中华人民共和国Hong Kong。

香港(Hong Kong)高等法院审判员判处前行政长官Donald Tsang 十多少个月禁锢。其因涉贪遭廉洁勤政公署起诉,随后被陪审团裁定犯有“公职职员行为失当罪”,成为东方之珠野史上第贰个遭刑事起诉并被判罪的参天长官。

© Tyrone Siu/Reuters

4月26日,新疆广州。

“二二八”七十周年,人们向纪念碑献上百合。

2.5.7 U福睿斯L names的命名空间

本课程例子中,唯有3个app也正是polls,然而在实际中很扎眼会有多少个、十三个、越来越多的app同时设有3个门类中。Django是如何区分那些app之间的UCR-VL
name呢?

答案是利用URLconf的命名空间。在polls/urls.py文件的始发部分,添加1个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表单相关。

March

© M. Kornmesser/AFP

五月27日,德意志希腊雅典。

南美洲南方天文台发布了一组根据数据和着眼制作的红矮星特拉普ist-1
图片。特拉普ist-1 距离地球约 40 光年,有 7
颗容量与地球相似的行星围绕。个中 3
颗行星位于宜居带,或然存在液态水,那标志当中恐怕有人命存在。

©Tyrone Turner/NYT

6月二十八日,U.S.A.华盛顿特区。

赫希杭博物馆展出了一组草间弥生的著述:Infinity Mirrors(无限镜屋)。

© U.S. Forces Korea

二月17日,南韩乌山。

末尾高空区域防御系统“萨德”抵达U.S.A.坐落大韩民国的乌山海军事营地地。

© Mark Lennihan/AP

5月二日,美利哥London。

华尔街铜牛对面出现了一座“无惧女孩”雕像。除为喜庆国际妇女节,也为优异金融圈内性别分裂的题材。

© Ahn Eunna/Reuters

7月三十一日,大韩民国熊川。

朴槿惠从总统府清空物品离开时向人群挥手致意。3 月 八日,当日韩国民法通则检察院宣布通过对朴槿惠的弹劾。5 月 十九日,共同民主党候选人文在寅以 41.09% 的得票率当选南朝鲜第 19 任总统。

©Goran Tomasevic/Reuters

七月216日,伊拉克卢萨卡。

一个人老爸带着孙女从阿比让 ISIS 控制地方逃离。

©林振东/端传媒

八月30日,中华人民共和国东方之珠。

林郑月娥胜出特首要采取举,成为香港(Hong Kong)特区首先位女性行政长官。

2.6.1 编写2个简单易行的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请求,就非得考虑贰个跨站请求伪造的难点,简称CSEvoqueF(具体意思请百度)。Django为您提供了一个简单的办法来幸免这么些麻烦,那正是在form表单内添加一条{%
    csrf_token
    %}标签,标签名不可更改,固定格式,地点任意,只如若在form表单内。不过(译者注),那些法子对form表单的交由格局有利好使,可是倘使是用ajax的法子交给数据,那么就很讨厌了。个人觉得不如直接在Django配置中关闭这么些近乎有功力,其实然并卵的CSXC60F得了。

近来,让我们成立叁个甩卖提交过来的数量的视图。前边大家已经写了贰个“占坑”的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是1个好像字典的目标,允许你通过键名访问提交的多寡。本例中,request.POST[’choice’]归来被选取选项的ID,并且值的品类永远是string字符串,这怕它看起来像数字,记住了!!!!同样的,你也得以用类似的手腕获取GET请求发送过来的数量,二个道理。
  • request.POST[’choice’]有或许接触二个KeyError至极,借使您的POST数据里没有提供choice键值,在那种意况下,上面的代码会回来表单页面并交由错误提醒。译者注:平时大家会给个暗中认可值,制止那种卓殊的发生,例如:request.POST[’choice’,None],八个None化解全部失水准。
  • 在甄选计数器加一后,重回的是七个HttpResponseRedirect而不是从前大家常用的HttpResponse。HttpResponseRedirect需求一个参数:重定向的U帕杰罗L。那里有三个提出,当你成功拍卖POST数据后,应当有限补助2个卓越的习惯,始终再次来到三个HttpResponseRedirect。这不只是对Django而言,它是三个杰出的WEB开发习惯。
  • 咱俩在上头HttpResponseRedirect的构造器中采纳了一个reverse()函数。它能帮助我们幸免在视图函数中硬编码U奥迪Q5L。它首先须求二个大家在UCRUISERLconf中钦赐的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视图的代码至极相似,有点冗余,那是三个程序猿不能够忍受的。他们都兼备类似的事务逻辑,完结类似的效用:通过从USportageL传递过来的参数去数据库查询数据,加载七个模板,利用刚才的数据渲染模板,再次回到那一个模板。由于这一个历程是这么的周边,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'),
]

请小心:在上头的的第贰,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节。

到此处,本节的情节结束了,你能够起来下一小节的就学。
以为博主翻译的仍是能够就点赞帮助一下吗!

April

© Till Rimmele/EPA

四月三十一日,俄罗斯克利夫兰。

一名中亚清真极端主义者在大巴站引爆了一枚装有重约 1
公斤爆炸物的安装,造成最少 14 人病逝,49 人受伤。

© Justin Tallis/AFP

四月3三十一日,英帝国London。

英帝国首相特蕾莎·梅正式向澳洲理事会主席签发信件,触发马尼拉条约第 50
条,运维为期两年的英帝国脱欧程序。

© Mohamed Albakour/AFP

十一月21日,叙孟菲斯伊德利卜省。

叙波德戈里察东北边一处被叛军占领的小镇碰到化学毒气沙林袭击,造成至少 伍十七位归西,逾 300 人负伤。

© Aly Song/Reuters

1月25日,中中原人民共和国新加坡。

同济内,男士背着猫咪走在樱花树下。

© Bret Hartman / TED

11月2七日,加拿大布拉迪斯拉发。

发明家在 TED 大会上显得他的“飞行衣”。

五  月

May

© Elmar Weiss/National Geographic

三月1一日,福Crane岛。

日出时分,一队企鹅正在通过沙滩。

© Reuters

3月二十日,中华夏族民共和国京城。

龙卷风中练习的老头。6日上马,中夏族民共和国南边大多数地段遇到龙卷风天气,包含首都在内的多座都市
PM10 浓度超过 1500 μg/m³。

© David Ramos/Getty

七月十六日,法国首都。

高级中学级派独立候选人埃马纽埃尔·马克龙以 66.06%
的得票率克服右翼政府国民阵线候选人勒庞,赢得法国选举。

© Dale de la Rey/AFP

二月2三日,中夏族民共和国香港(Hong Kong)。

香港(Hong Kong)香港民众安全服务队实行安全练习,模拟天灾,传染病,禽流行性咳嗽发生下的风险应对。图为禽鸟扑杀演练现场。

© Andressa Anholete/AFP

3月22二二十四日,巴西巴西波尔多。

巴西 NGO “和平里约”(Rio de Paz)在国会大楼前停放了 5九十一个面具,对应节制Michelle·特梅尔、联邦代表,及国会议员,以此抗议政党贪腐丑闻。

© Andrew Yates/Reuters

四月2二七日,大不列颠及英格兰联合王国圣Louis。

ISIS
极端协会分子在爱莉Anna·格兰德的西雅图篮球场巡演会场发动自杀式炸弹袭击,造成 2三人丧命,116 人负伤。

© Tyrone Siu/Reuters

五月2四日,中华布宜诺斯艾利斯。

湖南司检察院大法官发表澳大拉斯维加斯首宗同性婚姻释宪案结果,帮助同性婚姻合法化。宣布《民法》不允许同性建立“亲密、排他、永久关系”的规定违反刑事诉讼法,要求立法机关在
2 年内依解释意在达成有关法律之考订或制定。结果发表后,支持者拥抱庆祝。

©腾讯消息

3月5日,中中原人民共和国乌镇。

AlphaGo Master 以 3:0 打败世界排行第叁的柯洁。4月二120日,DeepMind
团队发表 AlphaGo
Zero,它经过深化学习的技艺在本人对弈中学会围棋,并制服了早前克制柯洁的
AlphaGo Master。



六  月

June

© Alexander Scheuber/Getty

5月13日,德意志Carl斯鲁厄。

芸芸众生身穿古典时装,脚踏高轮车,庆祝单车诞生 200 周年。

© Fayez Nureldine/AFP

一月二1七日,沙特圣地亚哥。

沙特阿拉伯、阿拉伯埃及共和国(The Arab Republic of Egypt)、巴林、阿拉伯联合酋长国、利比亚国、也门发布与卡塔尔断交,指责后者支持包括ISIS 在内的恐怖主义协会。卡塔尔批评各国提议的断绝外交关系理由“毫无事实根据”。

© 视觉中中原人民共和国

2月三日,United KingdomLondon。

一辆货车在清真寺外冲撞行人,造成 1 人病逝,九个人负伤。伦敦省长萨狄克·汗称那是一回可怕的恐怖袭击,指标是穆斯林职员,当时那几个人正好甘休祷告。

© Yangzijiang/VCG

1月11日,中中原人民共和国乔治敦。

Lin Shengbin lost his wife and three children in a house fire
deliberately started by his family’s nanny. Investigators later
discovered problems with low water pressure and firefighting
infrastructures of the apartment. In July, Mr. Lin set up a foundation
dedicated to improving firefighting standards in China.

© 网络截图

6月30日,中国。

China Netcasting Services Association (CNSA) released a new regulation
related to online broadcasting, “General Rules for Reviewing Netcasting
Content”. Numbers of contents and topics, including LGBT, sexual
freedom, religions, reviews on negative events, are banned on online
broadcasting. Earlier, Phoenix TV talk show, “Behind Headline with Wen
Tao,” hosted by anchor Dou Wentao, announced its suspension on Sina
Weibo. All previous videos are no longer available on the official
site. 

七  月

July

© Imaginechina/Rex

3月二十一日,中夏族民共和国首都。

teamLab
“舞蹈吗,艺术!寓教于乐的前途游乐园!”展览时期,参观众与方法装置互动。

© 陈焯辉/端传媒

4月123日,中中原人民共和国Hong Kong。

大学生驾鹤归西。Hong Kong市民雨中悼念。

© Mario Tama/Getty

八月二16日,巴西加尔各答。

非裔巴西人节,人们在瓦隆古码头跳舞庆祝。

© Franck Fife/AFP

7月20日,戈壁滩。

戈壁滩上的丝路国际汽车拉力赛进入第 12 比赛日程。

© Eastday.com

一月2二十2十四日,中华夏族民共和国东京。

北京频频高温,一度达 40.9℃,为北京世纪场馆记录史上的极值。

© Abdulmonam Eassa/AFP

十八月2四日,叙南宁阿尔滨。

袭击中负伤的男女们在如今医院接受医疗。

八  月

August

© Albert Damanik/Barcroft

二月二十十五日,印度尼西亚苏门答腊。

锡纳朋火山喷发,当地居民蒙上塑料袋遮挡火山灰。

© AFP

12月三十一日,中国青海。

21时十几分,阿坝州九寨沟县发出里氏 7.0 级地震,造成最少 24 人身故,49三个人受伤。图为总是抢险赈灾的消防军官和士兵在路边休息。

© Samuel Corum/Anadolu Agency

五月26日,美利坚联邦合众国维吉妮亚。

数百名黄人至上主义者和新纳粹在弗吉尼亚大学内集会。他们手持火炬穿过学校、高呼纳粹口号。

© Ahn Young-joon/AP

七月二15日,南韩大田。

第6届国际慰安妇纪念日,春川清溪广场的慰安少女摄影展。

© Santi Palacios/AP

六月12二二十八日,西班牙(Spain)马尼拉。

ISIS 极端组织成员驾车一辆货车冲向市核心兰布拉大道的人工胎盘早剥,造成 1四人去世,数十一人受伤。图为西班牙(Spain)太岁费利佩六世与王后莱蒂齐娅在街口悼念遇难者。

© Reuters

十月11日,中华夏族民共和国长沙。

家猪们跳入河中游泳。农场主人说这是它们的平凡移动之一。

© Andrei Duman/National Geographic

十一月215日,美利坚合众国加州。

微生物象牙白嗜盐菌作用下的驼色盐湖。

© 陈焯煇/端传媒

12月2230日,中夏族民共和国香江。

风暴“天鸽”吹袭香江,海水涌上白沙湾。

九  月

September

© Reuters

10月122日,朝鲜咸镜北道吉州郡。

朝鲜开始展览第八回核武器试验,发表引爆了一枚能够棉被服装载在洲际弹道导弹上的
hydrogen bomb。

© Dan Kitwood/Getty

3月二二十三日,缅甸孟加拉边界。

夜里下逃离缅甸的罗兴亚人。自 二〇一四 年起,因教派信仰引发的武力顶牛导致约有
87,000 名罗兴亚人逃离缅甸,前往印度尼西亚、马来亚和泰王国等周边国家避难。

© KCNA

9月15日,朝鲜。

金正在观察“紫炁星-12”中等射程弹道导弹发射。南朝鲜军方随后发射“白虎-2”导弹举行反制;东瀛政党向北南12县时有发生警报。该导弹飞行距离约为
3700 公里,飞越栃木县上空,掉落于东瀛北边 2200 公里的太平洋中。

© Fabrizio Bensch/Reuters

7月22日,德意志柏林(Berlin)。

默克尔(Merkel)领导的道教民主结盟取得大选胜利,将上马协调的第一届任期。

© Gerald Herbert/AP

十一月213日,波多黎各科罗萨尔。

波多黎各受龙卷风“玛莉亚”吹袭,一户人家的墙壁被整个吹走。

© Jeff J Mitchell / Getty

6月2二十一日,United Kingdom诺森伯兰郡。

五百余名裸泳者奔向加利利海,为慈善机构的募捐活动宣传。

© ImageChina

6月七日,中中原人民共和国浙江。

爱丁堡大熊猫繁育商量营地 2017 年出生的熊猫团子们预备拍戏集体照。

十  月

October

© David Becker/Getty

3月5日,U.S.A.格拉茨。

地面时间晚十点,一名枪手持自动步枪从曼德勒海湾饭店 32
楼窗台向音乐节人群扫射,造成最少 59 人与世长辞,527 人受伤。

© Tim Durkan

2月126日,美利坚合众国吉达。

月光下的太空针塔。

© Behrouz Mehri/AFP

四月二十四日,东瀛山梨县越谷。

一名汉子骑车经过选举海报。

© L’Osservatore Romano / AP

10月26日。

教宗方济各与梵蒂冈国际空间站的船员摄像交谈。

© Jeff J Mitchell/Getty

七月2八日,西班牙王国(The Kingdom of Spain)迈阿密。

西班牙王国自治区加泰罗尼亚议会独立决议以 70 票赞成、10 票反对和 2
票空白得到通过,加泰议会颁发该自治区从西班牙王国(The Kingdom of Spain)独立。西班牙(Spain)政坛进而公布通知称正式接管加泰罗尼亚地区,并免去该所在高档首领职分。图为帕劳将军广场上的独自支持者。

© Tolga Akmen/AFP

1十一月1日,United KingdomLondon。

化妆成蝙蝠侠的阿爸将闺女穿戴成哈雷·Quinn (Harley Quinn),前往 MCM
漫展的万圣节活动。

11月

November

© Caixin

112月,中华夏族民共和国南通。

Jiangxi Nangchang’s Yuzhang Shuyuan Institute has been accused of using
shocking torture methods on teenagers to make them get rid of internet
addictions. This photo shows a parent’s breaking into tears as she
recounted how her child had changed after studying at Yuzhang.

© 摄像截图

六月二十九日,中中原人民共和国北京。

One exposed video shows a female staff of Shanghai Ctrip daycare center
force-feeding wasabi to a child. Anotherideo shows a staffthrowing a
girl’s backpack on the ground and pushing her, causing her to fall and
hit the head on the edge of a desk. Parents believe this is not an
individual phenomenon, but a long-term, persistent “collective” abuse. 

© Jim Watson /AFP

三月22日,中华夏族民共和国首都。

川普到访中中原人民共和国,携老婆游览紫禁城。

© Pouria Pakizeh/AFP

五月6日,伊朗与伊拉克边界地区。

伊朗与伊拉克边界地区爆发 7.3 级地震,造成逾 450 人与世长辞、7,000 人负伤。

© 新华社

1二月十五日,中夏族民共和国首都。

A fire broke out in an apartment in Beijing’s southern Daxing suburb,
killing 19 people including 8 children. Most of the victims were migrant
workers. In response to the fire tragedy, Beijing has started a 40-day
citywide safety inspection. Thousands of migrant workers, referred as
“low-end population” in official documents, were evicted during the
crackdown. 

© 录像截图

10月十四日,中夏族民共和国首都。

Some parents of children who attend the Red Yellow Blue kindergarten
operated by RYB Education, said they found needle marks on their
children. Some parents also told the press their children had been given
unidentified pills and were sometimes locked inside a dark room as a
punishment.

© Gostra

三月215日,美利坚联邦合众国伦敦。

Messi百货感恩节游行上的皮卡丘气球。

© Jonas Stenqvist

11月27日,肯尼亚。

一群斑马正向着东非大裂谷的马拉河迁徙。

十 二 月

December

© Musa Al Shaer/AFP

11月二十八日,约旦河西岸。

川普在克里姆林宫公布阐述,宣布“认同乌鲁木齐为以色列国(The State of Israel)首都”,并布署将美利坚联邦合众国驻以色列国使馆迁往阿伯丁。图为巴勒Stan国抗议者与以色列国军队爆发抵触。

© VCG

2月1119日,中国Adelaide。

Adelaide大屠杀死难者国家公祭日,人们在防空警报声中默哀。

© AIAT

1月二十日,东瀛东京。

16 年 11 月 2三日黎明先生,留学生江歌在长野县立中学野区租屋前遇害。嫌疑犯为挚友刘鑫前男友陈世峰。案件随即在扶桑公审,东京(Tokyo)地点评判所判决陈世峰故意杀人罪和威迫罪创造,判处有期徒刑
20 年。

© David Cothran/NG

12月22日,北冰洋。

坐在浮冰上的北极熊。地文学家预测到 2050 年,北极熊的数码将压缩 3/10。

© Twitter: Hello Kitty

八月2二十日,扶桑四马路。

67 岁日本退休警察 Masao Gunji 与她的 Hello Kitty。Gunji 称 Kitty
能支持自个儿消除做警察的行事压力。35 年时间里,他共收藏了 5,169 件
Kitty,创下吉海法世界纪录。

© Ilya Naymushin/Reuters

五月21一日,俄罗丝克Russ诺雅茨克。

航空拍片下的冬季游泳俱乐部成员与 “2018”。

往期回顾

二〇一四,世界发出了何等?

二〇一四,世界爆发了哪些?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图