2017年4月4日
欢迎来到Django 1.11!
这些发行说明涵盖了 new features 以及一些 backwards incompatible changes 从django 1.10或更旧版本升级时,您需要注意。我们已经 begun the deprecation process for some features .
见 如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。
Django 1.11被指定为 long-term support release . 它将在发布后至少三年内收到安全更新。对之前LTS(Django 1.8)的支持将于2018年4月结束。
Django1.11需要python 2.7、3.4、3.5、3.6或3.7(从1.11.17开始)。我们 强烈推荐 只有官方支持每个系列的最新版本。
django 1.11.x系列是最后一个支持python 2的系列。下一个主要版本django 2.0将只支持python 3.4+。
与旧版本的django不同,django自己的拒绝警告在默认情况下不再显示。这与Python的默认行为一致。
此更改允许第三方应用程序支持Django 1.11 LTS和Django 1.8 LTS,而无需添加代码以避免出现拒绝警告。
在Django2.0发布之后,我们建议第三方应用程序作者放弃对1.11之前所有版本的Django的支持。那时,您应该能够使用 python -Wd
这样就出现了反预测警告。在修复了拒绝警告之后,您的应用程序应该与Django 2.0兼容。
新的 django.db.models.indexes
模块包含易于创建数据库索引的类。使用将索引添加到模型 Meta.indexes
选择权。
这个 Index
类创建b树索引,就像您使用 db_index
在模型栏上或 index_together
在模型上 Meta
班级。它可以子类化以支持不同的索引类型,例如 GinIndex
。它还允许定义索引列的顺序(ASC/DESC)。
为了方便自定义小部件,表单小部件呈现现在使用模板系统而不是Python完成。见 窗体呈现API .
您可能需要调整为数不多的自定义小部件 backwards incompatible changes .
Subquery
表达¶django.contrib.admin
¶ModelAdmin.date_hierarchy
现在可以跨关系引用字段。
新的 ModelAdmin.get_exclude()
hook允许基于请求或模型实例指定排除字段。
这个 popup_response.html
现在可以根据应用程序、每个模型或通过设置 ModelAdmin.popup_response_template
属性。
django.contrib.auth
¶pbkdf2密码散列器的默认迭代计数增加了20%。
这个 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
的属性 PasswordResetConfirmView
允许在成功重置密码后自动登录用户。如果你有多个 AUTHENTICATION_BACKENDS
配置,使用 post_reset_login_backend
属性来选择要使用的属性。
为了避免通过HTTP引用头泄漏密码重置令牌的可能性(例如,如果重置页包含对托管在其他域上的CSS或javascript的引用),请 PasswordResetConfirmView
(但不是被否决的 password_reset_confirm()
基于函数的视图)将令牌存储在会话中,并将其重定向到自身,以便在URL中没有令牌的情况下向用户显示密码更改表单。
update_session_auth_hash()
现在旋转会话密钥以允许更改密码以使被盗会话cookie失效。
新的 success_url_allowed_hosts
的属性 LoginView
和 LogoutView
允许指定一组在登录和注销后可以安全重定向的主机。
添加了密码验证程序 help_text
到 UserCreationForm
.
这个 HttpRequest
现在传递给 authenticate()
如果它接受一个 request
参数。
这个 user_login_failed()
信号现在接收到 request
参数。
PasswordResetForm
支持自定义用户模型,该模型使用的电子邮件字段名不是 '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
在空间上查找。
基于Openlayers的表单小部件现在使用 OpenLayers.js
从 https://cdnjs.cloudflare.com
哪个比旧的更适合生产使用 https://openlayers.org/
来源。它们也被更新为使用Openlayers 3。
PostGIS迁移现在可以更改字段维度。
增加了通过 size
, shape
和 offset
创建时的参数 GDALRaster
物体。
增加了对Oracle的支持 AsGML
函数, BoundingCircle
函数, IsValid
函数,以及 isvalid
查找。
django.contrib.postgres
¶新的 distinct
的参数 StringAgg
确定连接的值是否不同。
django.contrib.postgres.fields.JSONField
接受新的 encoder
参数指定自定义类来编码标准编码器不支持的数据类型。
新的 CIText
混合和 CITextExtension
迁移操作允许使用PostgreSQL citext
不区分大小写查找的扩展。提供三个字段: CICharField
, CIEmailField
,以及 CITextField
。
新的 JSONBAgg
允许将值聚合为JSON数组。
这个 HStoreField
(模型字段)和 HStoreField
(窗体字段)允许存储空值。
memcached后端现在传递 OPTIONS
作为客户端构造函数的关键字参数,允许对客户端行为进行更高级的控制。见 cache arguments 示例文档。
memcached后端现在允许在 LOCATION
为了方便在环境变量中使用此类字符串的第三方服务。
增加了 CSRF_USE_SESSIONS
允许在用户会话而不是cookie中存储CSRF令牌的设置。
增加了 skip_locked
参数 QuerySet.select_for_update()
在PostgreSQL 9.5+和Oracle上执行查询 FOR UPDATE SKIP LOCKED
.
增加了 TEST['TEMPLATE']
允许PostgreSQL用户指定用于创建测试数据库的模板的设置。
QuerySet.iterator()
现在使用 server-side cursors 在PostgreSQL上。此功能将部分工作内存负载(用于保存查询结果)转移到数据库,并可能增加数据库内存使用量。
添加了对 'isolation_level'
选择权 OPTIONS
允许指定 transaction isolation level . 为了避免可能的数据丢失,建议从mysql的默认级别repeatable read切换到read committed。
为添加了支持 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()
方法。
新的 empty_value
属性对 CharField
, EmailField
, RegexField
, SlugField
和 URLField
允许指定用于表示“空”的Python值。
新的 Form.get_initial_for_field()
方法返回窗体字段的初始数据。
数字格式和 NUMBER_GROUPING
设置支持不统一的数字分组。
新的 loaddata --exclude
选项允许在从设备加载数据时排除模型和应用程序。
新的 diffsettings --default
选项允许指定除Django的默认设置以外的设置模块进行比较。
app_label
现在的参数限制了 showmigrations --plan
输出。
添加了对序列化的支持 uuid.UUID
对象。
增加了对可调用值的支持 defaults
的参数 QuerySet.update_or_create()
和 get_or_create()
.
ImageField
现在违约了 validate_image_file_extension
验证器。(此验证器已移动到中的表单字段 Django 1.11.2 )
增加了对时间截断的支持 Trunc
功能。
增加了 ExtractWeek
从中提取周的函数 DateField
和 DateTimeField
把它暴露在 week
查找。
增加了 TruncTime
要截断的函数 DateTimeField
它的时间成分,并通过 time
查找。
添加了对中表达式的支持 QuerySet.values()
和 values_list()
.
添加了对采用多个参数的查找的查询表达式的支持,例如 range
.
您现在可以使用 unique=True
选项与 FileField
.
增加了 nulls_first
和 nulls_last
参数到 Expression.asc()
和 desc()
控制空值的顺序。
新的 F
表达 bitleftshift()
和 bitrightshift()
方法允许 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
属性允许子类自定义默认流。
编码器 JSON serializer 现在可以通过传递 cls
关键字参数 serializers.serialize()
功能。
DjangoJSONEncoder
现在序列化 timedelta
对象(由使用 DurationField
)
mark_safe()
现在可以用作装饰。
这个 regroup
标签现在返回 namedtuple
而不是字典,这样您可以直接在循环中解包Group对象,例如 {{% 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()
函数使构建自定义测试运行程序更加容易。
为添加了支持 unittest.TestCase.subTest()
使用时 test --parallel
选择权。
DiscoverRunner
现在在测试运行开始时运行系统检查。重写 DiscoverRunner.run_checks()
方法,如果要禁用它。
补充 FileExtensionValidator
验证文件扩展名和 validate_image_file_extension
验证图像文件。
django.contrib.gis
¶简化代码库,因为它比 contrib.gis
第一次被释放, GDAL 现在是geodjango的必需依赖项。在旧版本中,它只需要用于sqlite。
contrib.gis.maps
被删除,因为它与一个退出版本的谷歌地图API接口,似乎是未维护。如果你在使用它, let us know .
这个 GEOSGeometry
相等运算符现在还比较srid。
基于Openlayers的表单小部件现在使用Openlayers 3,并且 gis/openlayers.html
和 gis/openlayers-osm.html
模板已更新。如果您将这些小部件子类化或扩展模板,请检查您的项目。而且,新的小部件的工作方式与旧的小部件略有不同。不使用小部件中的工具栏,而是单击以绘制、单击并拖动以移动地图,然后单击并拖动点/顶点/角来移动地图。
对小于4.0的空间碎片的支持被丢弃。
放弃对gdal 1.7和1.8的支持。
中的小部件 contrib.gis.forms.widgets
管理员的 OpenLayersWidget
使用 form rendering API 而不是 loader.render_to_string()
. 如果您使用的是自定义小部件模板,则需要确保表单呈现器能够找到它。例如,您可以使用 TemplatesSetting
渲染器。
django.contrib.staticfiles
¶collectstatic
如果存在引用循环(例如, 'foo.css'
参考文献 'bar.css'
它本身引用了 'foo.css'
)或者,如果引用其他文件的文件链太深,无法在多次传递中解析。在后一种情况下,使用 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
参数,并返回将日期时间值强制转换为时间值所需的SQL。
使能 FOR UPDATE SKIP LOCKED
支持,设置 DatabaseFeatures.has_select_for_update_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月结束。因此,Django1.11将PostgreSQL 9.3设置为其官方支持的最低版本。
对Postgis2.0的支持也被删除,因为PostgreSQL 9.2是支持它的最后一个版本。
此外,PSycopg2的最低支持版本从2.4.5增加到2.5.4。
LiveServerTestCase
绑定到端口零¶与其选择一个端口范围并迭代以找到一个空闲端口, LiveServerTestCase
绑定到端口0并依赖操作系统分配可用端口。这个 DJANGO_LIVE_TEST_SERVER_ADDRESS
环境变量不再使用,而且由于它也不再使用,因此 manage.py test --liveserver
选项被删除。
如果你需要绑定 LiveServerTestCase
对于特定端口,使用 port
在django 1.11.2中添加的属性。
django.contrib.auth
和 i18n
意见¶LoginView
, LogoutView
(以及不推荐使用的基于函数的等价物),以及 set_language()
保护用户不被重定向到非HTTPS next
应用程序通过https运行时的URL。
QuerySet.get_or_create()
和 update_or_create()
验证参数¶为了防止打字错误安静地传递, get_or_create()
和 update_or_create()
检查它们的参数是否为模型字段。这应该是向后不兼容的,只是事实上它可能会在您的项目中暴露一个bug。
pytz
是必需的依赖项和支持 settings.TIME_ZONE = None
被移除¶为了简化Django的时区处理, pytz
现在是必需的依赖项。它与Django一起自动安装。
支持 settings.TIME_ZONE = None
由于该行为不常用且用处可疑,因此将其删除。如果要根据系统时区自动检测时区,可以使用 tzlocal **
from tzlocal import get_localzone
TIME_ZONE = get_localzone().zone
其工作原理类似于 settings.TIME_ZONE = None
except that it also sets os.environ['TZ']
. Let us know 如果有这样的用例,您发现无法调整代码来设置 TIME_ZONE
。
<p class="help">
替换为 <div>
标记以允许在帮助文本中包含列表。
只读字段被包装在 <div class="readonly">...</div>
而不是 <p>...</p>
允许任何类型的HTML作为字段的内容。
中的一些未记录类 django.forms.widgets
被移除:
SubWidget
RendererMixin
, ChoiceFieldRenderer
, RadioFieldRenderer
,
CheckboxFieldRenderer
ChoiceInput
, RadioChoiceInput
, CheckboxChoiceInput
无证件者 Select.render_option()
方法已删除。
这个 Widget.format_output()
方法已删除。而是使用自定义的小部件模板。
一些小部件值,例如 <select>
选项,现在本地化为 settings.USE_L10N=True
. 您可以使用使用 localize
用于关闭本地化的模板标记。
django.template.backends.django.Template.render()
禁止非dict上下文¶为了与多个模板引擎兼容, django.template.backends.django.Template.render()
(从高级模板加载器API返回,例如 loader.get_template()
)必须接收上下文词典,而不是 Context
或 RequestContext
. 如果您要传递这两个类中的任何一个,请改为传递一个字典——这样做与Django的旧版本向后兼容。
为了提高应用迁移的速度,相关模型的呈现会延迟到需要它们的操作(例如 RunPython
)如果您有一个自定义操作可用于 from_state
论点 database_forwards()
或 database_backwards()
,必须使用 clear_delayed_apps_cache()
方法如中所述 writing your own migration operation .
要做的改变 QuerySet.iterator()
在PostgreSQL上使用服务器端游标可防止在事务池模式下使用PgBouncer运行Django。要实现这一点,请使用 DISABLE_SERVER_SIDE_CURSORS
设置(在Django 1.11.1中添加)在 DATABASES
.
见 事务池和服务器端游标 更多讨论。
如果源中没有任何项具有 pubdate
或 updateddate
属性, SyndicationFeed.latest_post_date()
现在返回当前的UTC日期/时间,而不是没有时区信息的日期时间。
CSRF故障记录到 django.security.csrf
记录器而不是 django.request
.
ALLOWED_HOSTS
运行测试时不再禁用验证。如果应用程序包含具有自定义主机名的测试,则必须在 ALLOWED_HOSTS
. 见 测试和多个主机名 .
使用外键的ID(例如 'field_id'
在 ModelAdmin.list_display
显示相关对象的ID。删除 _id
如果要使用对象的字符串表示形式的旧行为,请使用后缀。
在模型形式中, CharField
具有 null=True
现在保存 NULL
对于空值而不是空字符串。
关于Oracle, Model.validate_unique()
不再检查空字符串的唯一性,因为数据库将值解释为 NULL
.
如果你是子类 AbstractUser
超驰 clean()
,一定要调用 super()
. BaseUserManager.normalize_email()
在新的 AbstractUser.clean()
方法,以便在模型表单验证等情况下应用规范化。
EmailField
和 URLField
不再接受 strip
关键字参数。删除它,因为它在旧版本的django中没有效果,因为这些字段总是去掉空白。
这个 checked
和 selected
表单小部件呈现的属性现在使用HTML5布尔语法而不是XHTML checked='checked'
和 selected='selected'
.
RelatedManager.add()
, remove()
, clear()
和 set()
现在清除 prefetch_related()
隐藏物。
为了防止可能丢失保存的设置, setup_test_environment()
如果在调用前第二次调用,则现在引发异常 teardown_test_environment()
.
无证件者 DateTimeAwareJSONEncoder
别名 DjangoJSONEncoder
(在Django 1.0中重命名)被删除。
这个 cached template loader
如果 OPTIONS['loaders']
未指定,并且 OPTIONS['debug']
是 False
(后一个选项默认为 DEBUG
)这可能是向后不兼容的,如果你有一些 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">
替换为 <div>
标记以允许在帮助文本中包含列表。
ConditionalGetMiddleware
不再设置 Date
标头,因为Web服务器设置该标头。它也不再设置 Content-Length
标头,因为这现在是由 CommonMiddleware
。
如果有一个中间件修改响应的内容并出现在 CommonMiddleware
在 MIDDLEWARE
或 MIDDLEWARE_CLASSES
设置,您必须重新排序中间件,以便在 Content-Length
设置,或让响应修改中间件重置 Content-Length
标题。
get_model()
和 get_models()
现在提高 AppRegistryNotReady
如果在加载所有应用程序的模型之前调用它们。以前,它们只需要加载目标应用程序的模型,因此可以返回模型而不建立所有关系。如果你需要 get_model()
设置 require_ready
参数 False
.
未使用的 BaseCommand.can_import_settings
属性被删除。
无证件者 django.utils.functional.lazy_property
被移除。
为了与非多部分请求保持一致, MultiPartParser.parse()
现在叶子 request.POST
不变的如果你要修改的话 QueryDict
,您现在必须先复制它,例如 request.POST.copy()
.
支持 cx_Oracle
<5.2被移除。
IPython<1.0的支架从 shell
命令。
私有API的签名 Widget.build_attrs()
从改变 extra_attrs=None, **kwargs
到 base_attrs, extra_attrs=None
.
类文件对象(例如, StringIO
和 BytesIO
)上载到 ImageField
现在使用测试客户机需要 name
属性的值通过 validate_image_file_extension
验证器。见注释 Client.post()
.
FileField
现在移动而不是复制它接收的文件。使用默认的文件上载设置,文件大于 FILE_UPLOAD_MAX_MEMORY_SIZE
现在具有与临时文件相同的权限(通常 0o600
)而不是系统的标准umask(通常 0o6644
)设置 FILE_UPLOAD_PERMISSIONS
如果您需要相同的权限,无论文件大小如何。
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
.
未使用的 extra_context
参数 contrib.auth.views.logout_then_login()
被贬低。
contrib.auth
的 password_change()
, password_change_done()
, password_reset()
, password_reset_done()
, password_reset_confirm()
和 password_reset_complete()
不赞成使用基于函数的视图,而赞成使用新的基于类的视图 PasswordChangeView
, PasswordChangeDoneView
, PasswordResetView
, PasswordResetDoneView
, PasswordResetConfirmView
和 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), *strings)
.
对于 PyLibMCCache
缓存后端,通过 pylibmc
行为设置作为的顶级属性 OPTIONS
被贬低。把它们放在 behaviors
关键在 OPTIONS
相反。
这个 host
参数 django.utils.http.is_safe_url()
为支持新的 allowed_hosts
参数。
在呈现 {{% include %}}
模板标记已被弃用,因为该行为通常比帮助更容易混淆。在Django 2.1中,将引发异常。
DatabaseIntrospection.get_indexes()
被否决,赞成 DatabaseIntrospection.get_constraints()
.
authenticate()
现在通过 request
论据 authenticate()
验证后端的方法。支持不接受的方法 request
因为第一个位置参数将在Django 2.1中删除。
这个 USE_ETAGS
设置已弃用,取而代之的是 ConditionalGetMiddleware
现在又增加了 ETag
无论设置如何,都会返回响应的头。 CommonMiddleware
和 django.utils.cache.patch_response_headers()
当折旧结束时将不再设置etags。
Model._meta.has_auto_field
已弃用,以便检查if Model._meta.auto_field is not None
.
使用正则表达式组 iLmsu#
在里面 url()
被贬低。唯一有用的组是 (?i)
然而,对于不区分大小写的URL,不区分大小写的URL不是一个好的实践,因为它们为搜索引擎创建多个条目。另一种解决方案可能是创建一个 handler404
它在URL中查找大写字符,并重定向到等效的小写字母。
这个 renderer
参数添加到 Widget.render()
方法。不接受该参数的方法将在折旧期内工作。
12月 18, 2023