2017年4月4日
欢迎来到Django 1.11!
这些发行说明涵盖了从Django 1.10或更旧版本升级时,您将需要注意new features,以及一些backwards incompatible changes。 We’ve begun the deprecation process for some features.
如果要更新现有项目,请参阅Upgrading Django to a newer version指南。
Django 1.11被指定为long-term support release。 它将在发布后至少三年内收到安全更新。 支持以前的LTS,Django 1.8将于2018年4月结束。
Django 1.11需要Python 2.7,3.4,3.5或3.6。 Django 1.11是第一个支持Python 3.6的版本。 我们强烈推荐,只有正式支持每个系列的最新版本。
Django 1.11.x系列是支持Python 2的最后一个版本。 下一个主要版本Django 2.0将仅支持Python 3.4+。
与旧版本的Django不同,Django自己的弃用警告在默认情况下不再显示。 这与Python的默认行为是一致的。
此更改允许第三方应用程序支持Django 1.11 LTS和Django 1.8 LTS,而无需添加代码以避免不推荐使用的警告。
在发布Django 2.0之后,我们建议第三方应用程序作者在1.11之前删除对所有版本的Django的支持。 那时候你应该可以使用python -Wd
来运行你的软件包的测试,这样就会出现弃用警告。 在进行了弃用警告修复后,您的应用程序应与Django 2.0兼容。
新的django.db.models.indexes
模块包含可轻松创建数据库索引的类。 使用Meta.indexes
选项将模型添加到模型中。
The Index
class creates a b-tree index, as if you
used db_index
on the model field or
index_together
on the model Meta
class.
它可以被子类化以支持不同的索引类型,例如GinIndex
。 它还允许为索引的列定义顺序(ASC / DESC)。
为了简化自定义窗口小部件,窗体小部件呈现现在使用模板系统而不是Python。 请参阅The form rendering API。
您可能需要调整您为几个backwards incompatible changes。
django.contrib.admin
¶ModelAdmin.date_hierarchy
现在可以跨关系引用字段。ModelAdmin.get_exclude()
钩子允许根据请求或模型实例指定排除字段。ModelAdmin.popup_response_template
属性可以覆盖popup_response.html
模板。django.contrib.auth
¶LoginView
和LogoutView
视图取代了基于功能的视图的不推荐使用的login()
和logout()
。PasswordChangeView
,PasswordChangeDoneView
,PasswordResetView
,PasswordResetDoneView
,PasswordResetConfirmView
和PasswordResetCompleteView
基于类的视图取代了不推荐的password_change()
,password_change_done()
,password_reset()
,password_reset_done()
,password_reset_confirm()
和password_reset_complete()
基于功能的视图。post_reset_login
attribute for
PasswordResetConfirmView
allows
automatically logging in a user after a successful password reset.
如果您配置了多个AUTHENTICATION_BACKENDS
,请使用post_reset_login_backend
属性来选择要使用的属性。PasswordResetConfirmView
(但不是已弃用) password_reset_confirm()
基于功能的视图)将令牌存储在会话中,并重定向到自身以向用户显示密码更改表单,而不在URL中使用令牌。update_session_auth_hash()
现在旋转会话密钥以允许密码更改以使被盗会话cookie无效。LoginView
和LogoutView
的新success_url_allowed_hosts
属性允许指定一组在登录和注销后重定向的主机。help_text
到UserCreationForm
。HttpRequest
现在被传递给authenticate()
,如果它接受request
参数,则继承它到认证后端。user_login_failed()
信号现在接收到一个request
参数。PasswordResetForm
supports custom user
models that use an email field named something other than 'email'
.
将CustomUser.EMAIL_FIELD
设置为字段的名称。get_user_model()
。django.contrib.contenttypes
¶remove_stale_contenttypes
命令中检测到陈旧的内容类型时,现在有一些相关对象的列表,例如auth.Permission
,也将被删除。 以前,只列出了内容类型(这个提示是在migrate
,而不是单独的命令)。django.contrib.gis
¶GEOSGeometry.from_gml()
和OGRGeometry.from_gml()
方法允许从GML创建几何。dwithin
查询的支持。Area
function,
Distance
function, and
distance lookups now work with geodetic coordinates on SpatiaLite.https://cdnjs.cloudflare.com
中的OpenLayers.js
更适合于生产使用而不是旧的http://openlayers.org
来源。 它们也被更新为使用OpenLayers 3。GDALRaster
对象时传递size,shape和offset参数的功能。IsValid
函数,MakeValid
函数和isvalid
查找的SpatiaLite支持。AsGML
函数,BoundingCircle
函数IsValid
函数和isvalid
查询的Oracle支持。django.contrib.postgres
¶StringAgg
的新distinct
参数决定了级联值是否不同。GinIndex
和BrinIndex
类允许在数据库中创建GIN
和BRIN
索引。JSONField
接受一个新的encoder
参数来指定一个自定义类来编码标准编码器不支持的数据类型。CIText
mixin和CITextExtension
迁移操作允许使用PostgreSQL的citext
扩展来进行不区分大小写的查找。 提供了三个字段:CICharField
,CIEmailField
和CITextField
。JSONBAgg
允许将值聚合为JSON数组。HStoreField
(模型字段)和HStoreField
(表单域)允许存储空值。OPTIONS
的内容作为关键字参数传递给客户端构造函数,从而允许对客户端行为进行更高级的控制。 有关示例,请参阅cache arguments文档。LOCATION
中将多个服务器定义为逗号分隔的字符串,以方便在环境变量中使用这样的字符串的第三方服务。CSRF_USE_SESSIONS
设置,以便将CSRF令牌存储在用户的会话中,而不是在cookie中。skip_locked
参数到QuerySet.select_for_update()
,以执行FOR UPDATE SKIP LOCKED
。TEST['TEMPLATE']
设置,让PostgreSQL用户指定一个用于创建测试数据库的模板。QuerySet.iterator()
现在在PostgreSQL上使用server-side cursors。 此功能将一些工作内存负载(用于保存查询结果)传输到数据库,并可能增加数据库内存使用量。OPTIONS
中的'isolation_level'
选项添加了MySQL支持,以允许指定transaction isolation level。 为了避免可能的数据丢失,建议从MySQL的默认级别切换到可重读的读取。cx_Oracle
5.3的支持。EMAIL_USE_LOCALTIME
设置,以允许在本地时区而不是UTC发送SMTP日期标头。EmailMessage.attach()
和attach_file()
现在回退到MIME类型application/octet-stream
因为UTF-8被指定为text/*
附件。io.TextIOWrapper
包装,File
现在有readable()
,writable()
和seekable()
方法。CharField.empty_value
属性允许指定用于表示“空”的Python值。Form.get_initial_for_field()
方法返回表单字段的初始数据。NUMBER_GROUPING
设置支持不一致的数字分组。loaddata --exclude
选项可以在从装置加载数据时排除模型和应用程序。diffsettings --default
选项允许指定除Django的默认设置之外的设置模块进行比较。app_label
的参数现在限制了showmigrations --plan
输出。uuid.UUID
对象的序列化的支持。QuerySet.update_or_create()
和get_or_create()
的defaults
参数中增加了对可调用值的支持。ImageField
现在有一个默认的validate_image_file_extension
验证器。
(此验证器移动到Django 1.11.2中的表单字段。)Trunc
功能的时间的支持。ExtractWeek
函数,从DateField
和DateTimeField
中提取一周,并通过week
查找。TruncTime
功能,将DateTimeField
截断到其时间组件,并通过time
查找显示。QuerySet.values()
和values_list()
中的表达式的支持。range
)的查询表达式的支持。FileField
选择unique=True
。nulls_first
和nulls_last
参数添加到Expression.asc()
和desc()
中以控制null值。F
expression bitleftshift()
and bitrightshift()
methods
allow bitwise shift operations.QuerySet.union()
,intersection()
和difference()
。QueryDict.fromkeys()
。CommonMiddleware
现在设置非流响应的Content-Length
响应头。SECURE_HSTS_PRELOAD
设置,允许将preload
指令附加到Strict-Transport-Security
头。ConditionalGetMiddleware
现在将ETag
标头添加到响应中。django.core.serializers.base.Serializer.stream_class
属性允许子类自定义默认流。cls
关键字参数传递给serializers.serialize()
函数来定制JSON serializer所使用的编码器。DjangoJSONEncoder
现在序列化timedelta
对象(由DurationField
使用)。mark_safe()
现在可以用作装饰器。Jinja2
模板后端现在通过在OPTIONS
中设置'context_processors'
选项来支持上下文处理器。regroup
tag now returns namedtuple
s instead of dictionaries
so you can unpack the group object directly in a loop, e.g.
{% for grouper, list in regrouped %}
.resetcycle
模板标签,以允许复位cycle
模板标签的顺序。filesystem.Loader
指定特定目录。DiscoverRunner.get_test_runner_kwargs()
以允许自定义传递给测试运行器的关键字参数。test --debug-mode
选项,通过将DEBUG
设置设置为True
django.test.utils.setup_databases()
(从django.test.runner
)和teardown_databases()
中的功能使得更容易建立定制测试跑步者。test --parallel
选项时,增加了对unittest.TestCase.subTest()
的支持。DiscoverRunner
现在在测试运行开始时运行系统检查。
如果要禁用,请覆盖DiscoverRunner.run_checks()
方法。FileExtensionValidator
以验证文件扩展名和validate_image_file_extension
来验证映像文件。django.contrib.gis
¶contrib.gis
时更容易安装,所以现在,对于GeoDjango来说,GDAL现在是必需的依赖项。 在旧版本中,只需要SQLite。contrib.gis.maps
被删除,因为它与Google Maps API的退役版本进行了接口,似乎不被保护。 如果你使用它,让我们知道。GEOSGeometry
等式运算符现在也比较了SRID。gis/openlayers.html
和gis/openlayers-osm.html
模板。 检查您的项目,如果您子类化这些小部件或扩展模板。 此外,新的小部件工作与旧的工具有点不同。
您不必在窗口小部件中使用工具栏,而是单击以绘制,单击并拖动以移动地图,然后单击并拖动点/顶点/角移动它。contrib.gis.forms.widgets
和管理员的OpenLayersWidget
中的小部件使用form rendering API而不是loader.render_to_string()
如果您使用自定义窗口小部件模板,则需要确保窗体渲染器可以找到它。 例如,您可以使用TemplatesSetting
渲染器。django.contrib.staticfiles
¶collectstatic
may now fail during post-processing when using a hashed
static files storage if a reference loop exists (e.g. 'foo.css'
references 'bar.css'
which itself references 'foo.css'
) or if the
chain of files referencing other files is too deep to resolve in several
passes. 在后一种情况下,使用ManifestStaticFilesStorage.max_post_process_passes
增加通过次数。ManifestStaticFilesStorage
时,运行时在清单中找不到静态文件,现在会引发一个ValueError
,而不是返回一个不变的路径。 您可以将ManifestStaticFilesStorage.manifest_strict
设置为False
来恢复旧的行为。DatabaseOperations.time_trunc_sql()
方法来支持TimeField
截断。 它接受lookup_type
和field_name
参数,并返回适当的SQL,以将给定的时间字段field_name
截短到仅具有特定特定性的时间对象。 lookup_type
参数可以是'hour'
,'minute'
或'second'
。DatabaseOperations.datetime_cast_time_sql()
方法来支持time
查找。 它接受field_name
和tzname
参数,并返回将datetime值转换为时间值所需的SQL。FOR 更新 SKIP LOCKED
支持,设置 = True
。DatabaseFeatures.supports_index_column_ordering
属性指定数据库是否允许为索引中的列定义排序。 默认值为True
,并且DatabaseIntrospection.get_constraints()
方法应在每个返回的字典中包含一个'orders'
键,并带有列表的'ASC'
和/或'DESC'
值对应于索引中每列的顺序。inspectdb
不再调用不推荐使用的DatabaseIntrospection.get_indexes()
。 自定义数据库后端应确保DatabaseIntrospection.get_constraints()
返回所有类型的索引。ignores_quoted_identifier_case
功能重命名为ignores_table_name_case
以更准确地反映其使用方式。name
关键字参数添加到DatabaseWrapper.create_cursor(self, name = None)
方法以允许使用的后端支持服务器端光标。PostgreSQL 9.2的上游支持在2017年9月结束。 因此,Django 1.11将PostgreSQL 9.3作为它正式支持的最低版本。
PostGIS 2.0的支持也被删除,因为PostgreSQL 9.2是支持它的最后一个版本。
此外,psycopg2的最低支持版本从2.4.5增加到2.5.4。
LiveServerTestCase
绑定到端口零¶而不是采用端口范围并迭代找到一个空闲端口,LiveServerTestCase
绑定到端口0,并且依靠操作系统分配一个空闲端口。 DJANGO_LIVE_TEST_SERVER_ADDRESS
环境变量不再使用,并且由于它也不再使用,manage.py 测试 -liveserver
选项被删除。
如果需要将LiveServerTestCase
绑定到特定端口,请使用Django 1.11.2中添加的port
属性。
django.contrib.auth
和i18n
视图中保护不安全的重定向¶LoginView
,LogoutView
(以及不推荐使用的基于功能的等效项)和set_language()
保护用户不被重定向到非HTTPS next
URL。
QuerySet.get_or_create()
和update_or_create()
验证参数¶为了防止打字错误地传递,get_or_create()
和update_or_create()
检查他们的参数是模型字段。 这应该是向后不兼容的事实,它可能会暴露在您的项目中的错误。
pytz
是设置的必需依赖关系和支持.TIME_ZONE = 无
已删除¶ T6>为了简化Django的时区处理,pytz
现在是必需的依赖项。
它与Django一起自动安装。
支持settings.TIME_ZONE = 没有
被删除,因为行为不常用,并且是有用的。 如果要根据系统时区自动检测时区,可以使用tzlocal:
from tzlocal import get_localzone
TIME_ZONE = get_localzone().zone
这与settings.TIME_ZONE = 无
类似,除了它也设置os.environ['TZ']
如果有一个用例,您发现无法调整代码以设置TIME_ZONE
,请告诉我们。
<p class="help">
is replaced with a <div>
tag to allow including lists
inside help text.
只读字段包裹在&lt; div class =“readonly”&gt; ...&lt; / div&gt;
而不是<p>...</p>
以允许任何类型的HTML作为字段的内容。
删除django.forms.widgets
中的一些未记录的类
SubWidget的
RendererMixin
,ChoiceFieldRenderer
,RadioFieldRenderer
,CheckboxFieldRenderer
ChoiceInput
,RadioChoiceInput
,CheckboxChoiceInput
未记录的Select.render_option()
方法被删除。
删除了Widget.format_output()
方法。 改用自定义窗口小部件模板。
如果settings.USE_L10N=True
,某些小部件值(例如<select>
选项)现在已被本地化。 您可以通过使用localize
模板标签的自定义窗口小部件模板来关闭本地化。
django.template.backends.django.Template.render()
禁止非dict语境¶为了与多个模板引擎兼容,django.template.backends.django.Template.render()
(从高级模板加载器API返回,如loader.get_template()
)必须接收上下文字典而不是Context
或RequestContext
。 如果你通过了两个类之一,通过一个字典代替 - 这样做是与旧版本的Django向后兼容的。
为了提高应用迁移的速度,相关模型的渲染被延迟到需要它们的操作(例如RunPython
)。 如果您有一个自定义操作适用于database_forwards()
或database_backwards()
中的from_state
参数的模型类或模型实例,则必须使用clear_delayed_apps_cache()
方法渲染模型状态,如writing your own migration operation。
pubdate
或updateddate
属性,则SyndicationFeed.latest_post_date()
现在返回当前UTC日期/时间,而不是没有任何时区信息的datetime。django.security.csrf
记录器,而不是django.request
。ALLOWED_HOSTS
验证。
如果您的应用程序包含自定义主机名的测试,则必须在ALLOWED_HOSTS
中包含这些主机名。 请参阅Tests and multiple host names。ModelAdmin.list_display
中使用外键的id(例如'field_id'
)显示相关对象的ID。 如果您想要对象的字符串表示形式的旧行为,请删除_id
后缀。CharField
与null=True
现在将NULL
保存为空值而不是空字符串。NULL
时,Model.validate_unique()
不再检查空字符串的唯一性。AbstractUser
并覆盖clean()
,请确保它调用了super()
。 BaseUserManager.normalize_email()
在新的AbstractUser.clean()
方法中调用,以便在模型窗体验证的情况下应用规范化。EmailField
和URLField
不再接受strip
关键字参数。 删除它,因为它在旧版本的Django中没有任何效果,因为这些字段总是删除空格。checked
and selected
attribute rendered by form widgets now uses
HTML5 boolean syntax rather than XHTML’s checked='checked'
and
selected='selected'
.RelatedManager.add()
,
remove()
,
clear()
, and
set()
now
clear the prefetch_related()
cache.teardown_test_environment()
之前再次调用setup_test_environment()
,则会引发异常。DjangoJSONEncoder
(在Django 1.0中重命名)的未记录的DateTimeAwareJSONEncoder
别名。cached template loader
is now enabled if DEBUG
is False
and
OPTIONS['loaders']
isn’t specified. 如果您有一些不线程安全的template tags that aren’t
thread safe,则可能会向后不兼容。migrate
命令后,不再发生陈旧内容类型删除的提示。 改用新的remove_stale_contenttypes
命令。IntegerField
小部件使用type="number"
而不是type="text"
。patch_response_headers()
不再添加Last-Modified
标题。 根据 RFC 7234#section-4.2.2,该标题与提供明确过期时间的其他缓存头一起是无用的,例如 Expires
或Cache-Control
。
UpdateCacheMiddleware
和add_never_cache_headers()
调用patch_response_headers()
,因此也受此更改的影响。<p class="help">
is replaced with a <div>
tag
to allow including lists inside help text.ConditionalGetMiddleware
不再设置Date
头。 它也不再设置Content-Length
头,因为现在由CommonMiddleware
完成。get_model()
and
get_models()
now raise
AppRegistryNotReady
if they’re called before
models of all applications have been loaded. 以前,他们只需要加载目标应用程序的模型,从而可以返回模型,而不必设置所有的关系。 如果您需要旧的行为get_model()
,请将require_ready
参数设置为False
。BaseCommand.can_import_settings
属性被删除。django.utils.functional.lazy_property
被删除。MultiPartParser.parse()
现在离开request.POST
不可变。 如果您要修改QueryDict
,则必须首先将其复制,例如request.POST.copy()
cx_Oracle
shell
命令中删除对IPython Widget.build_attrs()
的签名从extra_attrs = None, ** kwargs
更改为 base_attrs, extra_attrs = None
。StringIO
and BytesIO
)
uploaded to an ImageField
using the test client
now require a name
attribute with a value that passes the
validate_image_file_extension
validator.
请参阅Client.post()
中的注释。models.permalink()
装饰器¶改用django.urls.reverse()
。 像这样:
from django.db import models
class MyModel(models.Model):
...
@models.permalink
def url(self):
return ('guitarist_detail', [self.slug])
变为:
from django.db import models
from django.urls import reverse
class MyModel(models.Model):
...
def url(self):
return reverse('guitarist_detail', args=[self.slug])
contrib.auth
的login()
和logout()
不支持基于功能的视图,有利于新的基于类的视图LoginView
和LogoutView
。contrib.auth.views.logout_then_login()
的未使用的extra_context
参数。contrib.auth
’s password_change()
, password_change_done()
,
password_reset()
, password_reset_done()
, password_reset_confirm()
,
and password_reset_complete()
function-based views are deprecated in favor
of new class-based views
PasswordChangeView
,
PasswordChangeDoneView
,
PasswordResetView
,
PasswordResetDoneView
,
PasswordResetConfirmView
, and
PasswordResetCompleteView
.django.test.runner.setup_databases()
移动到django.test.utils.setup_databases()
。 旧位置已弃用。django.utils.translation.string_concat()
不利于django.utils.text.format_lazy()
。 string_concat(*strings)
可以替换为format_lazy('{}' * len(strings) t5> * strings)
。PyLibMCCache
缓存后端,将pylibmc
行为设置作为OPTIONS
的顶级属性不推荐使用。 将它们设置在OPTIONS
内的behaviors
键下。django.utils.http.is_safe_url()
的host
参数不利于新的allowed_hosts
参数。{% include %}
模板标记的沉默异常已被弃用,因为行为往往更令人困惑比有帮助 在Django 2.1中,将会提出异常。DatabaseIntrospection.get_indexes()
不利于DatabaseIntrospection.get_constraints()
。authenticate()
现在将request
参数传递给认证后端的authenticate()
方法。 支持不接受request
作为第一个位置参数的方法将在Django 2.1中被删除。USE_ETAGS
设置不利于ConditionalGetMiddleware
,现在将ETag
头添加到响应中,无论设置如何。 CommonMiddleware
and django.utils.cache.patch_response_headers()
will no longer set ETags
when the deprecation ends.Model._meta.has_auto_field
不利于检查Model._meta.auto_field 是否 不 无 T6> T2>。
url()
中使用iLmsu#
的正则表达式组已被弃用。
对于不区分大小写的URL,唯一有用的组是(?i)
,例如,不区分大小写的URL不是一个很好的做法,因为它们为搜索引擎创建了多个条目。 一个替代解决方案可能是创建一个handler404
,它在URL中查找大写字符,并重定向到小写字母。renderer
参数添加到Widget.render()
方法中。 不接受该参数的方法将通过弃用期工作。2017年9月6日