葡京娱乐注册Swift 3.0 项目升级实战

  • dispatch_once方法废弃,可以运用如下两栽办法贯彻:

迎大家拜我之个人网站《刘江的博客和课程》:www.liujiangblog.com

public extension DispatchQueue {
private static var _onceTracker =
String
/**
Executes a block of code, associated with a unique token, only once. The
code is thread safe and will
only execute the code once even in the presence of multithreaded
calls.

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


第一片段传送门

其三组成部分传递门

季部分传送门

3.2 模型与数据库Models and
databases

3.2.2 查询操作making
queries

3.3.8
会话sessions

  • parameter token: A unique reverse DNS style name such as
    com.vectorform.<name> or a GUID
  • parameter block: Block to execute once
    */
    public class func once(token: String, block:()->Void) {
    objc_sync_enter(self)
    defer { objc_sync_exit(self) }
    if _onceTracker.contains(token) {
    return
    }
    _onceTracker.append(token)
    block()
    }
    }

目录

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

仲栽艺术是苹果推荐的道(xCode自动将swift升级时,几乎拥有的dispath_once方法都见面自行转换成为下面这种样式),代码如下:

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

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

var t: SomeObject?
private static var __once: () = {
//此处做一次性操作
t = SomeObject()
}()

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

苟一味是亟需单例模式的讲话可以透过如下代码实现(static let
标记的常量,为线程安全的,并且是懒加载,只赋值一次于):

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

class SingleInstanceTest {
static let sharesdInstance = SingleInstanceTest()
private override init() {
// 注册通知等关初始化操作
}
}

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对象。

  • CGSize、CGPoint、CGRect 的make方法取消,需要利用CGSize(width: 1,
    height: 1)等措施开创
  • 无数原本的方式如systemFontOfSize都以最后之单词变为方法的表面参数名:UIFont.systemFont(ofSize:
    kGlobalFontSize_H)
  • UIColor等类别的好像方式还改成静态属性:

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

UIColor.redColor() -> UIColor.redColor
UIColor.clearColor() -> UIColor.clearColor

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

  • 制图直线等CoreGraphics操作由之前的CGPathMoveToPoint、CGPathAddLineToPoint变为path.move、path.addLine等,参数不转换(大多数CoreGraphics的点子调用都展示更swift化,可以查阅相关文档)。
  • 设方式包含返回值,例如

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

func sum(a: Int , b: Int) -> Int {
return a + b
}

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>

专注引用方法是引号而非是圆点也未是斜杠!!!!!!!!!!!!

到这,我们可进入下一些底学科了。

若是未待返回值可以经过 _ = sum(a: 5 , b: 6)来避免警告。

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

论有至关重要介绍form表单相关。

  • String与NSString必须出示转换例如,如下代码会报错:

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()查询来避免竞态的讨论和介绍。

func say(a: NSString) {
print(a)
}
var d : String = “hello”
say(a: d)

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

到这里,本节的情节了了,你可以起产同样有点节的求学。
认为博主翻译的尚足以纵点赞支持一下咔嚓!

这时候需要拿变量d显式转换为NSString

  • NSDateFormatter、NSNumberFormatter、NSBundle等深受彻底废除,需要采取DateFormatter和NumberFormatter、Bundle等取代,同时苹果推出Date、Data、Calendar等swift类型(去OC化正在紧张进行着,如果苹果推出新的swift类型可以替OC,可能会见拿原OC类型禁用掉,那么为以后swift升级降低代码的修改量,建议使用swift的色)。
  • GCD更swift化,swift3.0中可以使用DispatchQueue获取主线程、global线程或者创造单独的线程,线程任务的交给可以透过DispatchQueue的asyn、syn等(注意:通过点名线程优先级获取的global线程方法就将废弃,可以透过利用global(qos:_)->DispatchQueue创建)。
  • swift
    3.0着对屡次组的操作例如:插入、删除、判断是否含有的连带措施重复简短:insert(:
    , at:)、remove(at: )、contains(
    : )
  • swift 3.0面临得到类的称(类型)需要经过 type(of:
    _)方法取得,如下代码所示:

class Person {
class func className() -> String {
return String(describing: self)
}
func typeS () -> String {
return String(describing: type(of: self))
// type(of: _)相当于dynamicType
}
func typeO () -> Person.Type {
let c = type(of: self)
return c
}
}
var c = Person().typeS()
var d = Person.className()
var o = String(describing: Person().typeO())

  • swift3.0 中
    UIControl的状态(Normal、Disable、Highlight等)被装进到一个结构体中,并且该结构体实现了OptionSet协议,该协议用于掩码运算(注意:xCode会自动将.normal状态成为UIControlState(),可以改为.normal)。
  • swift3.0 的取余运算:在xcode转换swift版本时,会拿取余运算符%
    变为truncatingRemainder(dividingby:_),进入文档看了转swift3.0的标准库中大多矣许多之算数方法。
  • swift3.0通知改,通知中心由NSNotificationCenter 变为
    NotificationCenter,并且post与addObject方法被之key参数由NSNotification.Name代替,变化如下所示:

    // swift 2
    NSNotificationCenter.defaultCenter().postNotificationName(“kLogoutNotification”, object: nil)
    // swift 3
    NotificationCenter.default.post(name: NSNotification.Name.init(rawValue: “kLogoutNotification”), object: nil)

  • swift
    3.0法外参的扭转,第一只参数为要指定一个外参数(外参数为调用处显示的参数,内参数是在函数内以的参数),如果非指定他参数,需要有对接配符替代,代码如下所示:

// swift 2 的写法,方法第一只他参数,可以无欲展示为起
func Say(p: Int , two: Int , _ three: Int) {
print(“(p)”)
print(“(two)”)
print(“(three)”)
}
// swift 3 的写法,必须出示为有第一单参数的外参数,否则编译报错
func Say(_ p: Int , two: Int , _ three: Int) {
print(“(p)”)
print(“(two)”) // 第二个参数two可同时做内参数和他参数
print(“(three)”) // 通配符代替第三独参数,调用处可以无示他参数
}
Say(p: 0, two: 1, 2) //

  • swift 3.0
    枚举的生成,xCode升级swift时,会用所有的枚举类型的值得首字母变为题写(不强制,最好要按照这规则进行编码),代码如下:

enum SchoolRange: Int {
case default = 1
case province
case city
case nation
func title() -> String {
switch self {
case .province:
return “省级”
case .city :
return “市级”
case .nation:
return “国家级”
default:
return “县级”
}
}
}

  • swift3.0中之泛型可以博OC中泛型的型,如果以OC中使了泛型,那么在swift与OC的混编中,swift可以推测泛型占位符的类别,如下代码所示。

    // OC 泛型定义
    // OC 代码
    @interface Person
    {

    id _typeCode;
    

    }

    • (T)typeCode;
      @end
      @interface Student
    • (Person)typeCodeSchool;
      @end
      // swift 2.2
      var s: Student = Student()
      var c = s.typeCodeSchool() //c的项目也Person
      // swift 3.0
      var s: Student = Student()
      var c = s.typeCodeSchool() //c的品种也 Person
  • private 和
    fileprivate:在swift3中private的作用域缩小了,仅会在目前底大括号内被访,而fileprivate仅能够于眼前文件被让拜,如下代码所示

    // swift 2中 同一文件可以拜private标记的变量
    class Person {

    private var name: String!
    

    }
    class Student {

    func testPer(p: Person) {
        p.name = "Hello"   // swift 2中private标记的变量,可以被同一文件内的任何类、方法访问
    }
    

    }
    // swift 3中private标记的变量只能为{}中之艺术齐做客
    class Person {

    private var name: String!
    fileprivate var age: Int!
    

    }
    class Student {

    func testPer(p: Person) {
        p.age = 32  // swift3中fileprivate标记的变量可以在本文件中的任何位置访问
        p.name = "Hello"   // 此处编译错误
    }
    

    }

  • swift3.0中的Bool类型的变量名前都抬高了is如isEnable、isHidden等

  • swift3.0中新增open关键字,被open标记的变量可以让不同的module的类继承、重写,public标记的变量或者类可以于眼前module的切近继承、重写,默认情况下internal不可以被接续或重写。
  • swift3.0中之潜流闭包,如果闭包被当作参数传递到函数时,该闭包不欲就施行而是用等一些线程完成任务之后更实行,那么要以该闭包前加上@escaping,否则编译器报错。如下代码所示:

//以下函数是当动画页面动画结束以后执行一个闭包
func animationAfter(completion: @escaping () -> Void) {
UIView.animate(withDuration: 0.3, animations: {
// do some animation
}) { (isCom) in
completion()
}