Django 1.11 发行说明 — Django 文档
Django 1.10 版本发行说明
2017 年 4 月 4 日
欢迎来到 Django 1.11 版本!
这些发行说明涵盖了 新功能 ,以及从 Django 1.10 或更旧版本升级时您需要注意的一些 向后不兼容更改 。 我们已经 开始了某些功能 的弃用过程。
如果您要更新现有项目,请参阅 将 Django 升级到更新版本 指南。
Django 1.11 被指定为 长期支持版本 。 它将在发布后至少三年内收到安全更新。 对之前的 LTS Django 1.8 的支持将于 2018 年 4 月结束。
Python 兼容性
Django 1.11 需要 Python 2.7、3.4、3.5、3.6 或 3.7(从 1.11.17 开始)。 我们【X3X】强烈推荐【X23X】,官方只支持各系列的最新版本。
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 发布之后,我们建议第三方应用程序作者放弃对 Django 1.11 之前的所有版本的支持。 那时,您应该能够使用 python -Wd
运行包的测试,以便出现弃用警告。 修复弃用警告后,您的应用程序应该与 Django 2.0 兼容。
Django 1.11 中的新功能
基于类的模型索引
新的 django.db.models.indexes 模块包含易于创建数据库索引的类。 使用 Meta.indexes 选项将索引添加到模型中。
Index 类创建了一个 b 树索引,就像您在模型字段上使用 db_index 或在模型 Meta
类上使用 index_together 一样。 它可以被子类化以支持不同的索引类型,例如 GinIndex。 它还允许定义索引列的顺序 (ASC/DESC)。
次要特性
django.contrib.admin
- ModelAdmin.date_hierarchy 现在可以跨关系引用字段。
- 新的 ModelAdmin.get_exclude() 钩子允许根据请求或模型实例指定排除字段。
popup_response.html
模板现在可以被每个应用程序、每个模型覆盖,或者通过设置 ModelAdmin.popup_response_template 属性。
django.contrib.auth
- PBKDF2 密码哈希器的默认迭代计数增加了 20%。
- LoginView 和 LogoutView 基于类的视图取代了已弃用的
login()
和logout()
基于函数的视图。 - PasswordChangeView、PasswordChangeDoneView、PasswordResetView、PasswordResetDoneView、PasswordResetConfirmView[X151X6]、、、、基于视图取代已弃用的
password_change()
、password_change_done()
、password_reset()
、password_reset_done()
、password_reset_confirm()
和password_reset_complete()
函数基于的观点。 - PasswordResetConfirmView 的新
post_reset_login
属性允许在成功重置密码后自动登录用户。 如果您配置了多个AUTHENTICATION_BACKENDS
,请使用post_reset_login_backend
属性选择使用哪个。 - 为了避免通过 HTTP Referer 标头泄露密码重置令牌的可能性(例如,如果重置页面包含对托管在另一个域上的 CSS 或 JavaScript 的引用),PasswordResetConfirmView(但不是已弃用的 [ X250X] 基于函数的视图)将令牌存储在会话中并重定向到自身以向用户呈现密码更改表单,而 URL 中没有令牌。
- update_session_auth_hash() 现在轮换会话密钥以允许更改密码以使被盗的会话 cookie 无效。
- LoginView 和 LogoutView 的新
success_url_allowed_hosts
属性允许指定一组在登录和注销后可安全重定向的主机。 - 将密码验证器
help_text
添加到 UserCreationForm。 HttpRequest
现在被传递给 authenticate(),如果它接受request
参数,它又将它传递给身份验证后端。- user_login_failed() 信号现在接收
request
参数。 - PasswordResetForm 支持自定义用户模型,这些模型使用名为
'email'
以外的名称的电子邮件字段。 将 CustomUser.EMAIL_FIELD 设置为字段名称。 - get_user_model() 现在可以在导入时调用,即使在定义模型的模块中也是如此。
django.contrib.contenttypes
- 当在 :djadmin:`remove_stale_contenttypes` 命令中检测到陈旧的内容类型时,现在有一个相关对象列表,例如
auth.Permission
s 也将被删除。 以前,只列出了内容类型(并且此提示在migrate
之后而不是在单独的命令中)。
django.contrib.gis
- 新的 GEEOSGeometry.from_gml() 和 OGRGeometry.from_gml() 方法允许从 GML 创建几何。
- 在 SpatiaLite 上添加了对 :lookup:`dwithin` 查找的支持。
- Area 函数、Distance 函数和距离查找现在可以使用 SpatiaLite 上的大地坐标。
- 基于 OpenLayers 的表单小部件现在使用
https://cdnjs.cloudflare.com
中的OpenLayers.js
,这比旧的https://openlayers.org/
源更适合生产使用。 它们也更新为使用 OpenLayers 3。 - PostGIS 迁移现在可以更改字段尺寸。
- 添加了在创建 GDALRaster 对象时传递 size、shape 和 offset 参数的功能。
- 添加了对 IsValid 函数、MakeValid 函数和 :lookup:`isvalid` 查找的 SpatiaLite 支持。
- 添加了 Oracle 对 AsGML 函数、BoundingCircle 函数、IsValid 函数和 :lookup:`isvalid` 查找的支持。
django.contrib.postgres
- StringAgg 的新
distinct
参数确定连接的值是否不同。 - 新的 GinIndex 和 BrinIndex 类允许在数据库中创建
GIN
和BRIN
索引。 - JSONField 接受一个新的
encoder
参数来指定一个自定义类来编码标准编码器不支持的数据类型。 - 新的 CIText mixin 和 CITextExtension 迁移操作允许使用 PostgreSQL 的
citext
扩展进行不区分大小写的查找。 提供了三个字段:CICharField、CIEmailField 和 CITextField。 - 新的 JSONBAgg 允许将值聚合为 JSON 数组。
- HStoreField(模型字段)和 HStoreField(表单字段)允许存储空值。
缓存
- Memcached 后端现在传递以下内容 :设置:`选项 ` 作为客户端构造函数的关键字参数,允许对客户端行为进行更高级的控制。 有关示例,请参阅 缓存参数 文档。
- Memcached 后端现在允许将多个服务器定义为逗号分隔的字符串 :设置:`位置 ` ,为了方便在环境变量中使用此类字符串的第三方服务。
数据库后端
- 在 PostgreSQL 9.5+ 和 Oracle 上将
skip_locked
参数添加到 QuerySet.select_for_update() 以使用FOR UPDATE SKIP LOCKED
执行查询。 - 添加了 :设置:`测试['模板'] ` 设置让 PostgreSQL 用户指定用于创建测试数据库的模板。
- QuerySet.iterator() 现在在 PostgreSQL 上使用 服务器端游标 。 此功能将一些工作内存负载(用于保存查询结果)转移到数据库,并可能增加数据库内存使用量。
- 在 :setting:`OPTIONS` 中添加了对
'isolation_level'
选项的 MySQL 支持,以允许指定 事务隔离级别 。 为避免可能的数据丢失,建议从 MySQL 的默认级别可重复读取切换到已提交读取。 - 添加了对
cx_Oracle
5.3 的支持。
电子邮件
- 添加了 :setting:`EMAIL_USE_LOCALTIME` 设置以允许在本地时区而不是 UTC 中发送 SMTP 日期标头。
EmailMessage.attach()
和attach_file()
现在回退到 MIME 类型application/octet-stream
,当为text/*
附件指定了无法解码为 UTF-8 的二进制内容时。
管理命令
- 新的
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 中提取周,并通过 :lookup:`week` 查找公开。
- 添加了 TruncTime 函数以将 DateTimeField 截断到其时间组件,并通过 :lookup:`time` 查找将其公开。
- 添加了对 QuerySet.values() 和 values_list() 中的表达式的支持。
- 添加了对采用多个参数的查找的查询表达式的支持,例如
range
。 - 您现在可以将
unique=True
选项与 FileField 一起使用。 - 将
nulls_first
和nulls_last
参数添加到 Expression.asc() 和 desc() 以控制空值的排序。 - 新的
F
表达式bitleftshift()
和bitrightshift()
方法允许 按位移位操作 。 - 添加了 QuerySet.union()、intersection() 和 difference()。
请求和响应
- 添加了 QueryDict.fromkeys()。
- CommonMiddleware 现在为非流式响应设置
Content-Length
响应标头。 - 添加了 :setting:`SECURE_HSTS_PRELOAD` 设置以允许将
preload
指令附加到Strict-Transport-Security
标头。 - ConditionalGetMiddleware 现在将
ETag
标头添加到响应中。
序列化
- 新的
django.core.serializers.base.Serializer.stream_class
属性允许子类自定义默认流。 - JSON 序列化器 使用的编码器现在可以通过将
cls
关键字参数传递给serializers.serialize()
函数来自定义。 - DjangoJSONEncoder 现在序列化
timedelta
对象(由 DurationField 使用)。
模板
- mark_safe() 现在可以用作装饰器。
- 这 Jinja2 模板后端现在通过设置
'context_processors'
选项 :设置:`选项 ` . - :ttag:`regroup` 标签现在返回
namedtuple
s 而不是字典,所以你可以直接在循环中解压组对象,例如{% for grouper, list in regrouped %}
。 - 添加了 :ttag:`resetcycle` 模板标签以允许重置 :ttag:`cycle` 模板标签的顺序。
- 您现在可以为特定的 filesystem.Loader 指定特定的目录。
测试
- 添加了 DiscoverRunner.get_test_runner_kwargs() 以允许自定义传递给测试运行程序的关键字参数。
- 添加了
test --debug-mode
选项,通过将 :setting:`DEBUG` 设置为True
来帮助解决测试失败问题。 - 新的 django.test.utils.setup_databases()(从
django.test.runner
移出)和 teardown_databases() 函数可以更轻松地构建自定义测试运行程序。 - 添加了使用
test --parallel
选项时对python:unittest.TestCase.subTest()
的支持。 DiscoverRunner
现在在测试运行开始时运行系统检查。 如果要禁用该方法,请覆盖 DiscoverRunner.run_checks() 方法。
1.10 中的不向后兼容的变更
django.contrib.gis
- 为了简化代码库并且因为它比
contrib.gis
首次发布时更容易安装,GDAL 现在是 GeoDjango 的必需依赖项。 在旧版本中,只有 SQLite 需要它。 contrib.gis.maps
已被移除,因为它与 Google Maps API 的退役版本接口并且似乎没有维护。 如果你正在使用它, :ticket:`让我们知道 <14284>` .GEOSGeometry
相等运算符现在也比较 SRID。- 基于 OpenLayers 的表单小部件现在使用 OpenLayers 3,并且更新了
gis/openlayers.html
和gis/openlayers-osm.html
模板。 如果您对这些小部件进行子类化或扩展模板,请检查您的项目。 此外,新小部件的工作方式与旧小部件略有不同。 您不使用小部件中的工具栏,而是单击以绘制、单击并拖动以移动地图,然后单击并拖动一个点/顶点/角以移动它。 - 不再支持 SpatiaLite < 4.0。
- 不再支持 GDAL 1.7 和 1.8。
contrib.gis.forms.widgets
和管理员的OpenLayersWidget
中的小部件使用 表单渲染 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
来恢复旧行为。
数据库后端 API
本节介绍了第三方数据库后端可能需要的更改。
- 添加了
DatabaseOperations.time_trunc_sql()
方法以支持TimeField
截断。 它接受lookup_type
和field_name
参数并返回适当的 SQL 以将给定的时间字段field_name
截断为仅具有给定特异性的时间对象。lookup_type
参数可以是'hour'
、'minute'
或'second'
。 - 添加了
DatabaseOperations.datetime_cast_time_sql()
方法以支持 :lookup:`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'
值对应于索引中每一列的排序。 - :djadmin:`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 和 PostGIS 2.0
对 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 绑定到端口 0
LiveServerTestCase
绑定到端口 0 并依赖操作系统分配一个空闲端口,而不是获取端口范围并迭代以找到一个空闲端口。 DJANGO_LIVE_TEST_SERVER_ADDRESS
环境变量不再使用,由于它也不再使用,所以删除了 manage.py test --liveserver
选项。
如果需要将 LiveServerTestCase
绑定到特定端口,请使用 Django 1.11.2 中添加的 port
属性。
防止 django.contrib.auth 和 i18n 视图中的不安全重定向
LoginView
、LogoutView
(以及已弃用的基于函数的等价物)和 set_language() 保护用户在以下情况下不会被重定向到非 HTTPS next
URL该应用程序通过 HTTPS 运行。
QuerySet.get_or_create() 和 update_or_create() 验证参数
为了防止输入错误,get_or_create() 和 update_or_create() 检查它们的参数是否是模型字段。 这应该是向后不兼容的,因为它可能会暴露您的项目中的错误。
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
的工作原理类似,除了它还设置 os.environ['TZ']
。 如果您发现无法调整代码以设置 TIME_ZONE
,请告诉我们 。
管理模板中的 HTML 更改
<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
。 您可以使用使用 :ttag:`localize` 模板标签关闭本地化的自定义小部件模板恢复到旧行为。
django.template.backends.django.Template.render() 禁止非字典上下文
为了与多个模板引擎兼容,django.template.backends.django.Template.render()
(从 loader.get_template()
等高级模板加载器 API 返回)必须接收上下文字典而不是 Context
或 [ X192X]。 如果您要传递两个类中的任何一个,请改为传递字典 - 这样做与旧版本的 Django 向后兼容。
迁移操作中的模型状态变化
为了提高应用迁移的速度,相关模型的渲染会延迟到需要它们的操作(例如 RunPython
)。 如果您有一个自定义操作适用于 database_forwards()
或 database_backwards()
中的 from_state
参数中的模型类或模型实例,您必须使用 clear_delayed_apps_cache()
渲染模型状态] 方法,如 编写您自己的迁移操作 中所述。
PostgreSQL 上的服务器端游标
使 QuerySet.iterator() 在 PostgreSQL 上使用服务器端游标的更改阻止在事务池模式下使用 pgBouncer 运行 Django。 要实现这一点,请使用 :设置:`DISABLE_SERVER_SIDE_CURSORS ` 设置(在 Django 1.11.1 中添加)在 :设置:`数据库` .
有关更多讨论,请参阅 事务池和服务器端游标 。
杂项
如果提要中没有项目具有
pubdate
或updateddate
属性,SyndicationFeed.latest_post_date() 现在返回当前的 UTC 日期/时间,而不是没有任何时区的日期时间信息。CSRF 失败记录到
django.security.csrf
记录器而不是django.request
。:setting:`ALLOWED_HOSTS` 运行测试时不再禁用验证。 如果您的应用程序包含带有自定义主机名的测试,您必须在 :setting:`ALLOWED_HOSTS` 中包含这些主机名。 请参阅 测试和多个主机名 。
使用外键的 id(例如
ModelAdmin.list_display
中的'field_id'
) 显示相关对象的 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() 之前第二次调用时会引发异常。
删除了 DjangoJSONEncoder(在 Django 1.0 中重命名)的未记录的
DateTimeAwareJSONEncoder
别名。这缓存模板加载器现在启用如果 :设置:`选项['装载机'] ` 未指定并且 :设置:`选项['调试'] ` 是
False
(后一个选项默认为 :设置:`调试` )。 如果您有一些 模板标签不是线程安全的 ,这可能是向后不兼容的。运行
migrate
命令后不再出现陈旧内容类型删除提示。 改用新的 :djadmin:`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 完成。如果您有修改响应内容的中间件并出现在
MIDDLEWARE
或MIDDLEWARE_CLASSES
设置中的CommonMiddleware
之前,则必须重新排序中间件,以便在 [ X202X] 已设置,或让响应修改中间件重置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
。使用测试客户端上传到 ImageField 的类文件对象(例如,
StringIO
和BytesIO
)现在需要name
属性的值通过validate_image_file_extension 验证器。 请参阅 Client.post() 中的注释。FileField 现在移动而不是复制它收到的文件。 使用默认文件上传设置,大于 :setting:`FILE_UPLOAD_MAX_MEMORY_SIZE` 的文件现在具有与临时文件相同的权限(通常是
0o600
),而不是系统的标准 umask(通常是0o6644
)。 如果无论文件大小如何都需要相同的权限,请设置 :setting:`FILE_UPLOAD_PERMISSIONS`。
在 1.11 中被废弃的功能
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
的password_change()
、password_change_done()
、password_reset()
、password_reset_done()
、password_reset_confirm()
和password_reset_complete()
不推荐使用基于函数的视图,取而代之的是新的基于类的视图 PasswordChangeView、PasswordChangeDoneView、PasswordResetView、PasswordResetDoneView[X26277X5X] 和 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
的顶级属性传递。 将它们设置在OPTIONS
内的behaviors
键下。 django.utils.http.is_safe_url()
的host
参数已弃用,取而代之的是新的allowed_hosts
参数。- 渲染时引发的静默异常 :ttag:`{% 包含 %} ` 模板标签已被弃用,因为该行为通常比帮助更令人困惑。 在 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()
将不再设置 ETag。Model._meta.has_auto_field
已弃用,以支持检查Model._meta.auto_field is not None
。- 不推荐在
url()
中使用带有iLmsu#
的正则表达式组。 唯一有用的组是(?i)
用于不区分大小写的 URL,但是,不区分大小写的 URL 不是一个好的做法,因为它们会为搜索引擎创建多个条目,例如。 另一种解决方案可能是创建一个 handler404,它会在 URL 中查找大写字符并重定向到等效的小写字符。 renderer
参数被添加到 Widget.render() 方法中。 不接受该参数的方法将在弃用期期间起作用。