按产品经营能力划分,我们需要看怎样书

不久前干活上忙劳累碌工作,相同的作业周而复始难免会止步不前,感觉已将近迷失,需要重新补充下能量。但正如人们都说过的,产品总裁知识是一个复杂而博大且没有专门教材的教程,所以花了点时间,按产品首席营业官所需的能力,分别整理了几本无可非议的书,遵照自己在哪些方面缺少或需要运用,挑着读一读。

欢迎我们访问我的个体网站《刘江的博客和学科》:www.liujiangblog.com

本来分类不是这多少个严酷,因为书不会只讲一个点,知识也是互通的。

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


第一部分传送门

其三有的传送门

第四局部传送门

3.2 模型和数据库Models and
databases

3.2.2 查询操作making
queries

3.3.8
会话sessions

▏逻辑思考

1.《学会提问:批判性思维指南》

2.《批判性思维:带您走出思想的误区》

3.《思考,快与慢》

4.《批判性思维工具》

目录

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 使用泛型视图:裁减代码冗余

**▏创新**

1.《别做常规的傻瓜》

2.《这也能体悟?巧妙解答无厘头问题》

3.《打开餐巾纸(〈餐巾纸的北侧〉之实用手册)》

4.《idea+打开设计师的创意百宝箱》

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

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

需要分析

1.《Tmall十年产品事》

2.《启示录:打造用户喜爱的制品》

3.《腾讯传》

4.《需求:创造光辉商业传奇的有史以来力量》

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节。

▏商业价值

1.《免费:商业的前景》

2.《从0到1:开启商业与将来的秘闻》

3.《商业格局新生代》

4.《重来》

5.《跨越界限》

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 urlfrom . import viewsurlpatterns = [ # 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),

产品运营

1.《从零起始做运营》

2.《用户力:需求使得的产品、运营和商业形式》

3.《长尾理论2.0》

4.《我看电商》

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

前边我们说过,每个视图至少做两件事之一:再次来到一个富含呼吁页面的HttpResponse对象或者弹出一个类似Http404的分外。此外的则随你便,你爱干嘛干嘛。

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

而Django想要的只有HttpResponse或者一个卓殊。

因为这么很省心,接下去让我们利用DJango自己的数据库API,大家在上边的教程里介绍过的。上边是一个新的index()视图,它会基于宣布日期呈现近日的5个投票问卷,通过逗号分隔。

polls/views.py

from django.http import HttpResponsefrom .models import Questiondef 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 HttpResponsefrom django.template import loaderfrom .models import Questiondef 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 renderfrom .models import Questiondef 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对象。

产品设计

1.《简约至上:交互式设计四国策》

2.《用户体验要素:以用户为着力的产品设计》

3.《点石成金:访客至上的网页设计秘笈》

4.《在你身边,为您设计:腾讯的用户体验设计之道》

5.《写给我们看的设计书》

6.《About Face3交互设计精髓》

2.5.4 404错误

当今让我们来编排重返具体问卷文本内容的视图:

polls/views.py

from django.http import Http404from django.shortcuts import renderfrom .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, renderfrom .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是一个和两个的区别!)

数据解析

1.《总结数字会说谎》

2.《巴菲特教你解析财报》

3.《何人说菜鸟不会数据解析》

4.《深切浅出数据解析》

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节的沙盘向导!

心理学

1.《消费者行为学》

2.《怪诞心思学》

3.《乌合之众:丰田心绪学》

4.《马斯洛人本艺术学》

5.《人类简史:从动物到上帝》

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'),

交流协调

1.《非暴力交流》

2.《高难度谈话》

3.《关键对话》

4.《身份的担忧》

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 urlfrom . import viewsapp_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>

只顾引用方法是引号而不是圆点也不是斜杠!!!!!!!!!!!!

到此,我们可以进去下一些的教程了。

时光管理

1.《高效率人员的六个习惯》

2.《番茄工作法图解》

3.《搞定:无压工作的办法》

4.《小强升职记:时间管理故事书(升级版)》

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

本有的重大介绍form表单相关。

花色管理

1.《海底捞你学不会》

2.《深切浅出PMP》

3.《人月神话》

4.《敏捷猜测与统筹》

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, renderfrom django.http import HttpResponseRedirect, HttpResponsefrom django.urls import reversefrom .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, renderdef 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()查询来避免竞态的讨论和介绍。

工具运用

1.《PPT炼成记》

2.《Excel图表之道:如何创制专业有效的商务图表》

3.《Word排版艺术》

4.《UML出色:标准对象建模语言简明指南》

5.《Axure RP 6原型设计精髓》

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

上边的detail、index和results视图的代码相当相像,有点冗余,这是一个程序猿无法经受的。他们都怀有类似的事务逻辑,实现类似的功用:通过从URL传递过来的参数去数据库查询数据,加载一个模板,利用刚才的数据渲染模板,重临这几个模板。由于这个过程是如此的宽广,Django又很善解人意的帮您想办法偷懒了,它提供了一种连忙形式,名为“泛型视图”系统。

当今,让大家来尝试看将本来的代码改为使用泛型视图的不二法门,整个经过分三步走:

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

注释:Django官方的“辩解”
为何本学科的代码来回改动这么频繁?
答:平日在写一个Django的app时,大家一起头就要控制是行使泛型视图如故不要,而不是等到代码写到一半了才重构你的代码成泛型视图。但是本课程为了让您清晰的知道视图的内蕴,“故意”走了一条比较2的路,因为大家的文学是:在您采纳统计器此前你得先清楚基本的数学公式。

修改URLconf

打开polls/urls.py文件,将其修改成上边的指南:

from django.conf.urls import urlfrom . import viewsapp_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, renderfrom django.http import HttpResponseRedirectfrom django.urls import reversefrom django.views import genericfrom .models import Choice, Questionclass 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节。

到此地,本节的始末结束了,你能够开头下一小节的上学。
觉得博主翻译的还足以就点赞襄助一下吧!

技能知识

1.《推荐系统进行》

2.《Tmall技术那十年》

3.《数学之美》

4.《构建之法》

终极为便于我们学习,整理了电子版的书本,有需要的可以点此购买


笔者:璟扬,前Tmall产品老总,现电商创业狗,微信公众号:思维新势力。

相关文章

Comment ()
评论是一种美德,说点什么吧,否则我会恨你的。。。