新普金娱乐网址


《嫌疑人X的授命》|孤独的质数

哥德尔的本体论证明,以及,没必要那么复杂的超快速证明

Shut Up and Calculate

  • 八月 31, 2018
  • 数学
  • 没有评论

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是一个及多单之区别!)

Shut Up and Calculate (闭上嘴,动笔去算)

数学 1

ArkaniHamedPostF17.jpg

近来大神Nima在康奈尔大学举行了一个面向大众的讲座,题目就是是“Three Cheers
for Shut Up and Calculate in Fundamental Physics”。
比较遗憾的凡,网上并无讲座的照,也未尝讲座的讲义。不过好庆幸的凡在Peter
Woit 和 Motl的博客及还发生针对性斯讲座的褒贬。这简单个人口是殊对头(Tom and
Jerry那种),经常于博客上相互攻击(Motl是大神级别之弦论学家,Peter
Woit是“臭名昭著”的反弦论主义者)。Motl自称虽然也没扣留了Nima的讲座,但是经过她们连年底交流暨雅,他好推论讲座的情,并形容了扳平篇长文
“2.7 cheers for shut up and
calculate”。文章特别风趣,暗合我心目对物理的见地的平等种植变化。这里终于对那篇博文某种程度上之“转译”还有就是是针对好想法,心境的均等种记录。所以自己只是代表温馨对文章的掌握,任何可能的荒谬都出自自身的偏见,感兴趣之爱侣可扣押Motl的原文还有如找到Nima的讲座,欢迎@我。

先录最近微博高达看罢之一个段:“费曼说,相对论流行之后,很多哲学家跳出来说“坐标系是相对的,这难道说不是绝本的哲学要求为?这个我们既懂得了!”可是如果您告知她们光速在有坐标系下非变换,他们不怕会呆。所以的确的科学家其实正如“想象家”更发生想象力。”(转载李淼的微博)
再度录一个自我好亲身经历的截:一糟达到信息课的时节,教授不知怎么就说到弦论学家了。学生咨询他俩是举行什么的,教授说她们到底东西(they
compute),然后大家就是一起会心的笑起来。我掌握讲课的弦外音是,弦论学家的工作累是计量好复杂的东西,但是于他们到底的事物意义可能连无净知道。那个教授本人十分喜爱的,虽然非是费曼的嫡传学生,但是他是以费曼还以的加州理工毕业的。我呢总以为他发生一点费曼的阴影,他今天凡做信息,
inference
还有熵的,他还有他协调打信息角度出发的对量子力学的阐发,大概是怎通过极端要命熵来演绎薛定谔方程。
实在这以课堂上,作为系里弦论组的一致各项心里要稍狼狈,但是以自立马底想法的心气,又当他说的慌有道理,无从反驳。作为从小看爱因斯坦以及费曼的着第二物理菜鸟,我以前一直当物理就是那种天才的管事乍现,还有就是是上马行空的情理思维实验。当自己确实做物理的当儿,发现完全无是那么回事,很多底上是于数学的窘况里挣扎,还有对自己到底有底结果意义之嫌疑同不足中。慢慢地自我倒爱上了这种“可以计算”的乐趣。但是菜鸟就是菜鸟。如同玩一个嬉戏,一个菜鸟和一个pro高端玩家当此玩里的童趣是全然两样之,可以说他们玩的毕无是一个游乐。在吟味到高端玩家的喜的前头,我一点为未思放弃去。抱歉说了部分闲话与废话,下面开始正题。

诚如有点儿栽类型的物理学家,一种植乎领取问题的人(asker or seer),
他们好在发现物理概念里的抵触可能通过由其他一样角度对物理概念的掌握来把物理推向更远或是提出新的推测和苟。另一样类似人也解决问题的丁(solver),他们是思念当管物理问题在数学方面正式,从而只在数学之范畴上化解得于数学回答的题材。也有人(Freeman
Dyson)把这点儿栽人各自名为鸟和青蛙。Shut Up and
Calculate当然就是青蛙等的实用哲学。
优质的景象下,应该像鸟们那样做研究,在头脑风暴里,理清正确的物理概念以及逻辑,像侦探一样,把所有的凭据综合起来得到一个合理的分解然后帅气的说生那么句:真相只有出一个。然后拿多余的工作或者不紧要之底细都提交不知名的略警察(例如研究生)就哼了。
但实质上情形是自从一个理论的雏形到终极理论的多变是一个好久的进程。如果实际的案件,真相往往是以大气底走访还有证据收集后慢慢发生的。在案件的开端看还有证据的采集广大上以是所谓的飞禽枪法。为了调研嫌疑人的行迹,你或许要拘留有或的监控录像。你恐怕抱怨你切莫是以羁押侦探推理剧而是刑侦剧,证据收集及走访并不需要天才的查访和黑马的演绎而是按的照本宣科。类似地立刻吗是对准成千上万理论工作的一个埋怨,你莫是以做物理,而是纯数学而都:你而大凡于清除一个偏微分方程,你但是大凡以解矩阵的准征值等等。你可能说这些青蛙等踊跃的无足够高,看不到任何完整的情理图像。比如弦论,从80年代起即受叫做可以讲一切的情理理论,但是至今为止弦论还是无一个普遍接受的非微扰的构建(AdS/CFT可能是)。
但Shut Up and
Calculate背后的一个理念是单独通过物理图像是不敷清楚物理的,对于物理理论还充分层次理解来自数学。人类的语言有上是不足够清楚真正的大体的。在夜半更深望着满天星星我扪心自问,我确实懂量子力学吗?这个时刻唯一可自身确信还有安慰的即是和谐解决了之一个并且一个的事例和题材,我可计算氢原子的能级,自旋,可以测算隧穿的概率还有散射振幅。而且我懂得这些计算结果都赢得了尝试的印证。尽管我或者无确定自己清楚的量子力学,但是本人至少自己知如果因数学好安息个好觉,不用失去思维哲学上之形而上。我连无是避让这好像题材,有些人可能这些形而上的问题才是当真的理论物理,什么是时空?什么是波函数?什么是自旋?等之类。所有有关这些的讨论自己还感谢兴趣,但是自确实对待很倚重的题材是那些提供了切实可行的缓解大方向的。换句话来说,没有答案的题目不是题材;有答案而完全不知道怎么样去摸索的题目呢不是题材。一些所谓的“民科”的训斥不是她们不够聪明,而是他们不经意现有的答案,反而自命不凡的提出自己的问题还有自己所谓的答案。并无是说她们突破正统的大体不对,让人口气愤的是她们对那些曾经有的答案的疏忽与偏见。
Motl最后还表达他对物理未来一律种担忧。我或一直翻的口舌吧:“如果你在youtobe上摸
量子力学,排在最好前的视频发大体60万的点击率。可是对于当以了手上理论物理界最有钱300万Milner物理突破大奖被最为喜人最为有生命力的Nima,他的有关基本物理定律的视频的点击率可能连前的视频的一个零头都达到不顶。。。。。。。那60万之观看者并不仅仅是平常物理爱好者,还连不少博士,甚至物理博士,还闹任何科学记者,科学机构的工作人员。但是当对物理感兴趣充满惊异的儿女还有学生想使审了解物理的时节,他们取却只是废物。以自家对社会的相,那些履行着不忘记初心知道好在举行啊的物理学家正在日渐灭绝,被那些假教授借科学家排斥驱逐,而这些叫兽们却逐步联合在一起统治起科学界。那些有前途称为理想物理学的男女在成长的长河中不得不给各种陷阱,虚假的消息,打击还有威胁,究极生微微人口得坚持到最后吧?”
Molt的立番话还真的有些痛心疾首悲天悯人矣。老板说,学术就漫漫道路就是如长征,人越发活动更少。最后成为不成佛都或如运动相同遭受的。

2.5.6 删除模板被硬编码的URLs

以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视图的URL更换也polls/specifics/12/,那么您切莫需要在模板被另行修改url地址了,仅仅只有需要在polls/urls.py文件中,将相应的正则表达式改成为下面这样的虽实施了:

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

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_DIRS参数为设置也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函数的首先只参数),第二独岗位参数是模板,还得有一个可选的老三参数—一个字典,包含需要传递让模板的数据。最后render函数返回一个经过字典数据渲染了之模版封装而成的HttpResponse对象。

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请求,就必考虑一个跨站请求伪造的问题,简称CSRF(具体意思请百度)。Django为卿提供了一个简单易行的艺术来避免这个困扰,那就是当form表单内上加同长{%
    csrf_token
    %}标签,标签名不可更改,固定格式,位置任意,只要是于form表单内。但是(译者注),这个艺术对form表单的付方式有利好使,但是只要是故ajax的计提交数据,那么就算很讨厌了。个人认为无若直接以Django配置中关闭是类似发生意图,其实然并卵的CSRF得矣。

现今,让咱创建一个甩卖提交过来的数据的视图。前面我们早就勾勒了一个“占坑”的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需要一个参数:重定向的URL。这里出一个建议,当你成拍卖POST数据后,应当保持一个可以的惯,始终返回一个HttpResponseRedirect。这不只是指向Django而言,它是一个不错的WEB开发习惯。
  • 咱于点HttpResponseRedirect的构造器中利用了一个reverse()函数。它亦可辅助我们避免在视图函数中硬编码URL。它首先需一个咱当URLconf中指定的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.5 第一个Django app,Part 3:视图和模板

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

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文件里安的根URL配置文件。在拖欠公文里,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]+则是一个要命粗略的原生正则表达式,用于匹配同多级连续的数字,它相当到之价值吗就算是实际而传送的参数值。

有着的URL模式还是正则表达式,Django不限制而当url模式面临的写方式。但是,你确实没必要书写一个之类的比较愚蠢的带有”.html”的模式,它不言而喻是没必要,不够精炼之:

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

而一点一滴可为此脚的模式代表上面的:

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

欢迎大家看我的私有网站《刘江的博客及科目》:www.liujiangblog.com

2.5.7 URL names的命名空间

准课程例子中,只来1只app也即是polls,但是当切实中格外引人注目会出5单、10单、更多之app同时有一个类型受到。Django是如何区分这些app之间的URL
name呢?

答案是下URLconf的命名空间。在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.2 使用泛型视图:减少代码冗余

上面的detail、index和results视图的代码非常相似,有硌冗余,这是一个主次猿不能够忍受的。他们都富有类似的事体逻辑,实现类似之功效:通过由URL传递过来的参数去数据库查询数据,加载一个模板,利用刚才之数渲染模板,返回这个模板。由于斯过程是这般的周边,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节。

至这里,本节的内容了了,你可以起下一样小节之修。
认为博主翻译的尚可以纵点赞支持一下咔嚓!

目录

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 URL names的命名空间

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

  • 2.6.1 编写一个简易的form
  • 2.6.2 使用泛型视图:减少代码冗余

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


先是局部传送门

老三片传递门

季片段传送门

3.2 模型与数据库Models and
databases

3.2.2 查询操作making
queries

3.3.8
会话sessions

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.1 概览

一个视图就是一个网页“类型”,通常提供一定的成效要特定的模板。例如:在一个博客应用被,你可能会见视下列视图:

  • 博客主页:显示最新公布之部分情节
  • 条目详细页面:每个条目对应的千古页面
  • 据悉年之稿子页面:显示指定年内之持有博客文章
  • 基于月之稿子页面:显示指定月内的装有博客文章
  • 根据天的篇章页面:显示指定日内的保有博客文章
  • 颁发评论:处理对某篇博客发布的褒贬

当我们的投票应用中,我们用起下面的视图:

  • 问卷“index”页:显示最新的组成部分问卷
  • 问卷“detail”页面:显示一个问卷的事无巨细文本内容,没有调查结果但是有一个投票或检察表单。
  • 问卷“results”页面:显示有问卷的投票或调查结果。
  • 投票动作页面:处理对某个问卷的有选项的投票动作。

当Django中,网页和另的局部情还是由此视图来散发的。视图呈现呢一个简单易行的Python函数(在根据类的视图中谓方法)。Django通过比请求的URL地址来挑选相应之视图。

以你平常之网页上,你也许时时会面碰到类似“ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B”的url。庆幸之是Django支持采取更为简介的URL模式,而不需编制上面那种复杂的url。

一个URL模式其实就算是一个URL通用表达式,例如:/newsarchive///。为了令URL模式映射到对应之视图,DJango使用URLconfs来形成就无异于工作。本课程介绍中心的URLconfs使用办法,更多之情,请参见6.23节。

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图