2015年12月1日
欢迎来到Django 1.9!
这些发行说明涵盖了 new features 以及一些 backwards incompatible changes 从django 1.8或更旧版本升级时,您需要注意。我们已经 dropped some features 已经到了他们的折旧周期结束,我们已经 begun the deprecation process for some features .
见 如何将Django升级到更新版本 如果正在更新现有项目,则提供指南。
Django1.9需要python 2.7、3.4或3.5。我们 强烈推荐 只有官方支持每个系列的最新版本。
Django1.8系列是最后一个支持Python3.2和3.3的系列。
新的 on_commit()
钩子允许在成功提交数据库事务后执行操作。这对于发送通知电子邮件、创建排队任务或使缓存无效等任务很有用。
此功能来自 django-transaction-hooks 包已经集成到Django中。
Django现在提供密码验证,以帮助防止用户使用弱密码。验证集成在包含的密码更改和重置表单中,并且很容易集成到任何其他代码中。验证由一个或多个在新的 AUTH_PASSWORD_VALIDATORS
设置。
Django中包含四个验证器,它们可以强制使用最小长度,将密码与用户名等用户属性进行比较,确保密码不完全是数字,或者检查常见密码的包含列表。您可以组合多个验证器,并且一些验证器具有自定义配置选项。例如,您可以选择提供常用密码的自定义列表。每个验证器都提供一个帮助文本来向用户解释其需求。
默认情况下,不会执行任何验证并接受所有密码,因此如果不设置 AUTH_PASSWORD_VALIDATORS
,您将看不到任何变化。在使用默认值创建的新项目中 startproject
模板,启用一组简单的验证器。要在包含的项目身份验证表单中启用基本验证,可以设置,例如:
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
见 密码验证 了解更多详细信息。
Django现在和Mixins一起发货 AccessMixin
, LoginRequiredMixin
, PermissionRequiredMixin
和 UserPassesTestMixin
提供 django.contrib.auth.decorators
用于基于类的视图。这些混音是从 django-braces 项目。
Django和 django-braces
但是,实现:
这个 raise_exception
属性只能是 True
或 False
. 不支持自定义异常或可调用项。
这个 handle_no_permission()
方法不采用 request
参数。当前请求可用于 self.request
.
习俗 test_func()
属于 UserPassesTestMixin
不采取 user
参数。当前用户可用于 self.request.user
.
这个 permission_required
属性支持一个字符串(定义一个权限)或一个字符串列表/元组(定义多个权限),这些字符串需要满足才能授予访问权限。
新的 permission_denied_message
属性允许将消息传递到 PermissionDenied
例外。
contrib.admin
¶管理运动现代,平面设计与新的SVG图标,看起来完美的HIDPI屏幕。它仍然为 YUI's A-grade 浏览器。较旧的浏览器可能会经历不同程度的优雅降级。
这个 test
命令现在支持 --parallel
在多个进程中并行运行项目测试的选项。
每个进程都有自己的数据库。您必须确保不同的测试用例不访问相同的资源。例如,接触文件系统的测试用例应该创建一个临时目录供自己使用。
默认情况下,此选项为Django自己提供的测试套件启用:
操作系统支持它(除了Windows以外的所有操作系统)
数据库后端支持它(除了Oracle之外的所有内置后端)
django.contrib.admin
¶管理视图现在有 model_admin
或 admin_site
属性。
管理更改视图的URL已更改(位于 /admin/<app>/<model>/<pk>/
默认,现在位于 /admin/<app>/<model>/<pk>/change/
)这不会影响您的应用程序,除非您有硬编码的管理URL。在这种情况下,将这些链接替换为 reversing admin URLs 相反。请注意,为了向后兼容,旧的URL仍然会重定向到新的URL,但在将来的版本中可能会删除它。
ModelAdmin.get_list_select_related()
已添加以允许更改 select_related()
基于请求在管理员的变更列表查询中使用的值。
这个 available_apps
已将列出当前用户可用应用程序的上下文变量添加到 AdminSite.each_context()
方法。
AdminSite.empty_value_display
和 ModelAdmin.empty_value_display
已添加以覆盖管理更改列表中空值的显示。还可以自定义每个字段的值。
添加了jquery事件 when an inline form is added or removed 在“更改表单”页上。
时间选择器小部件包括一个“6 p.m”选项,用于保持每6小时有一个预定义选项的一致性。
javascript slug生成现在支持罗马尼亚字符。
django.contrib.admindocs
¶的模型部分 admindocs
现在还描述了采用参数而不是忽略参数的方法。
django.contrib.auth
¶pbkdf2密码散列器的默认迭代计数增加了20%。这种向后兼容的更改不会影响子类化的用户 django.contrib.auth.hashers.PBKDF2PasswordHasher
更改默认值。
这个 BCryptSHA256PasswordHasher
现在将更新密码 rounds
属性已更改。
AbstractBaseUser
和 BaseUserManager
被移到新的 django.contrib.auth.base_user
模块,以便在不包括 django.contrib.auth
在里面 INSTALLED_APPS
(这样做在旧版本中引发了一个拒绝警告,Django 1.9不再支持此操作)。
的权限参数 permission_required()
接受所有类型的iterables,而不仅仅是list和tuples。
新的 PersistentRemoteUserMiddleware
使其可以使用 REMOTE_USER
对于只在登录页面而不是会话中的每个请求上填充头的设置。
这个 django.contrib.auth.views.password_reset()
视图接受 extra_email_context
参数。
django.contrib.contenttypes
¶现在可以使用 order_with_respect_to
用一个 GenericForeignKey
.
django.contrib.gis
¶所有 GeoQuerySet
方法已被弃用并替换为 equivalent database functions . 一旦在代码中替换了遗留方法,您甚至应该能够删除 GeoManager
从支持GIS的类。
gdal接口现在支持基于文件和内存的实例化 GDALRaster objects 从原始数据。已添加栅格属性(如投影或像素值)的设置器。
对于Postgis用户,新的 RasterField
允许 storing GDALRaster objects . 它支持在保存模型时自动创建和重新投影空间索引。它还不支持空间查询。
新的 GDALRaster.warp()
方法允许通过指定目标格栅属性(例如原点、宽度、高度或像素大小(等))来扭曲格栅。
新的 GDALRaster.transform()
方法允许通过指定目标将栅格转换为不同的空间参考系统 srid
.
新的 GeoIP2
类允许使用MaxMind的geolite2数据库,其中包括对IPv6地址的支持。
小部件中包含的默认Openlayers库版本已从2.13更新为2.13.1。
django.contrib.postgres
¶增加了对 rangefield.contained_by
查找与范围字段相对应的某些内置字段。
增列 django.contrib.postgres.fields.JSONField
。
补充 PostgreSQL特定聚合函数 .
增加了 TransactionNow
数据库函数。
django.contrib.sessions
¶会议模式和 SessionStore
类的 db
和 cached_db
后端被重构以允许在其基础上构建自定义数据库会话后端。见 扩展数据库支持的会话引擎 了解更多详细信息。
django.contrib.sites
¶get_current_site()
现在处理案件 request.get_host()
收益率 domain:port
,例如 example.com:80
. 如果查找失败,因为主机与数据库中的记录不匹配,并且主机有端口,则会删除该端口,并仅使用域部分重试查找。
django.core.cache.backends.base.BaseCache
现在有一个 get_or_set()
方法。
django.views.decorators.cache.never_cache()
现在发送更具说服力的邮件头(添加 no-cache, no-store, must-revalidate
到 Cache-Control
)更好地防止缓存。这在Django 1.8.8中也增加了。
用于CSRF身份验证的请求头的名称可以用自定义 CSRF_HEADER_NAME
.
CSRF引用头现在根据 CSRF_COOKIE_DOMAIN
设置(如果设置)。见 它是如何工作的 有关详细信息。
新的 CSRF_TRUSTED_ORIGINS
设置提供了一种允许跨源不安全请求(例如 POST
)通过HTTPS。
PostgreSQL后端 (django.db.backends.postgresql_psycopg2
)也可作为 django.db.backends.postgresql
. 旧名称将继续用于向后兼容。
Storage.get_valid_name()
当 upload_to
是可赎回的。
File
现在有 seekable()
方法。
ModelForm
接受新 Meta
选项 field_classes
自定义字段类型。见 覆盖默认字段 有关详细信息。
现在可以指定表单字段的呈现顺序 field_order
属性 field_order
构造函数参数,或 order_fields()
方法。
表单前缀不仅可以在实例化表单时在表单类内指定。见 表单的前缀 有关详细信息。
现在你可以 specify keyword arguments 要传递给窗体集中窗体的构造函数的。
SlugField
现在接受一个 allow_unicode
参数允许在段塞中使用Unicode字符。
CharField
现在接受 strip
用于除去前导空格和尾随空格的输入数据的参数。因为这默认为 True
这与以前的版本不同。
表单域现在支持 disabled
参数,允许浏览器禁用字段小部件显示。
现在可以通过重写字段的 get_bound_field()
方法。
使用生成的基于类的视图 as_view()
现在有 view_class
和 view_initkwargs
属性。
method_decorator()
现在可以与修饰符列表或元组一起使用。它也可以用来 decorate classes instead of methods .
这个 django.views.i18n.set_language()
立即正确查看重定向到 translated URLs ,如果有。
这个 django.views.i18n.javascript_catalog()
如果在同一页上多次使用不同的配置,则View现在可以正常工作。
这个 django.utils.timezone.make_aware()
函数得到一个 is_dst
用于帮助解决DST转换期间不明确时间的参数。
现在可以使用getText支持的区域设置变量。这些通常用于可以用不同脚本编写的语言,例如拉丁语和西里尔文(例如 be@latin
)
增加了 django.views.i18n.json_catalog()
视图以帮助在Django翻译后构建自定义客户端i18n库。它返回包含翻译目录、格式设置和复数规则的JSON对象。
增加了 name_translated
属性返回的对象 get_language_info
模板标签。还添加了相应的模板筛选器: language_name_translated
.
您现在可以运行 compilemessages
从项目的根目录中,它将找到由创建的所有应用程序消息文件 makemessages
.
makemessages
现在呼叫 xgettext
每个区域设置目录一次,而不是每个可翻译文件一次。这加快了本地化构建的速度。
blocktrans
支持使用 asvar
.
有两种新语言可供选择:哥伦比亚西班牙语和苏格兰盖尔语。
新的 sendtestemail
命令允许您发送一封测试电子邮件,以便轻松确认通过Django发送的电子邮件是否正常工作。
以提高所生成SQL代码的可读性 sqlmigrate
,为每个迁移操作生成的SQL代码前面都有该操作的说明。
这个 dumpdata
命令输出现在是确定顺序的。而且,当 --output
选项已指定,它还显示终端中的进度条。
这个 createcachetable
命令现在有一个 --dry-run
用于打印而不是执行SQL的标志。
这个 startapp
命令创建 apps.py
文件。因为它不使用 default_app_config
(a discouraged API )必须指定应用程序配置的路径,例如 'polls.apps.PollsConfig'
在 INSTALLED_APPS
以供使用(而不是 'polls'
)
使用PostgreSQL后端时, dbshell
命令可以使用设置文件中的密码连接到数据库(而不是要求手动输入密码)。
这个 django
包可以作为脚本运行,即 python -m django
,其行为与 django-admin
.
具有 --noinput
现在也可以选择 --no-input
作为该选项的别名。
初始迁移现在标记为 initial = True
类属性,允许 migrate --fake-initial
更容易检测初始迁移。
添加了对序列化的支持 functools.partial
和 LazyObject
实例。
供应时 None
作为一个值 MIGRATION_MODULES
,Django将该应用程序视为不带迁移的应用程序。
在应用迁移时,当使用详细程度2或更高版本运行迁移时显示的“呈现模型状态”步骤现在只计算已应用迁移的状态。正在应用的迁移的模型状态是按需生成的,大大减少了所需的内存量。
但是,当取消应用迁移时,这种改进是不可用的,因此仍然需要对中间迁移状态进行预计算和存储。
这一改进还要求Django不再支持混合迁移计划。混合计划由一系列迁移组成,其中一些正在应用,另一些则未应用。这从未得到官方支持,也从未有过支持此行为的公共API。
这个 squashmigrations
命令现在支持指定从中挤压迁移的开始迁移。
QuerySet.bulk_create()
现在在代理模型上工作。
数据库配置获得 TIME_ZONE
用于与在本地时间存储日期时间且不支持时区的数据库交互的选项 USE_TZ
是 True
.
增加了 RelatedManager.set()
方法创建的相关经理 ForeignKey
, GenericForeignKey
和 ManyToManyField
.
这个 add()
反向外键上的方法现在具有 bulk
允许执行一个查询的参数,而不管添加的对象数是多少,而不是每个对象一个查询。
增加了 keep_parents
参数到 Model.delete()
只允许删除使用多表继承的模型中的子级数据。
Model.delete()
和 QuerySet.delete()
返回删除的对象数。
添加了一个系统检查以防止同时定义 Meta.ordering
和 order_with_respect_to
在同一型号上。
Date and time
查找可以与其他查找(例如 exact
, gt
, lt
等)。例如: Entry.objects.filter(pub_date__month__gt=6)
.
现在支持时间查找(小时、分钟、秒) TimeField
用于所有数据库后端。Django 1.7中添加了对非sqlite后端的支持,但未记录。
您可以指定 output_field
的参数 Avg
聚合以便聚合非数字列,例如 DurationField
.
增加了 date
查找到 DateTimeField
只允许按日期部分查询字段。
增加了 Now
数据库函数,返回当前日期和时间。
Transform
现在是的子类 Func() 允许 Transform
在表达式的右侧使用,就像正则表达式一样 Func
这允许注册一些数据库函数,比如 Length
, Lower
和 Upper
作为转换。
SlugField
现在接受一个 allow_unicode
参数允许在段塞中使用Unicode字符。
在中添加了对引用注释的支持 QuerySet.distinct()
.
connection.queries
在sqlite上显示带有替换参数的查询。
Query expressions 现在可以在创建新模型实例时使用 save()
, create()
和 bulk_create()
.
除非 HttpResponse.reason_phrase
是显式设置的,它现在由 HttpResponse.status_code
. 修改的值 status_code
在构造函数外部还将修改 reason_phrase
.
debug视图现在显示了python 3上链接异常的详细信息。
默认的40x错误视图现在接受第二个位置参数,这是触发视图的异常。
现在支持查看错误处理程序 TemplateResponse
,通常与基于类的视图一起使用。
由提出的异常 render()
方法现在传递到 process_exception()
每个中间件的方法。
请求中间件现在可以设置 HttpRequest.urlconf
到 None
恢复先前中间件所做的任何更改并返回到使用 ROOT_URLCONF
.
这个 DISALLOWED_USER_AGENTS
登记入住 CommonMiddleware
现在提出一个 PermissionDenied
与返回 HttpResponseForbidden
以便 handler403
被调用。
补充 HttpRequest.get_port()
获取请求的起始端口。
增加了 json_dumps_params
参数到 JsonResponse
允许将关键字参数传递到 json.dumps()
用于生成响应的调用。
这个 BrokenLinkEmailsMiddleware
现在当Referer等于所请求的URL时忽略404。为了绕过已经实现的空Referer检查,一些网络机器人将Referer设置为请求的URL。
使用创建的模板标记 simple_tag()
帮助程序现在可以使用 as
参数。
增加了一个 Context.setdefault()
方法。
这个 django.template 已添加记录器,其中包含以下消息:
A DEBUG
缺少上下文变量的级别消息。
A WARNING
在呈现期间引发的未捕获异常的级别消息 {{% include %}}
当调试模式关闭时(有帮助,因为 {{% include %}}
停止异常并返回空字符串)。
这个 firstof
模板标记支持使用“as”将输出存储在变量中。
Context.update()
现在可以用作上下文管理器。
Django模板加载器现在可以递归地扩展模板。
现在,调试页模板的后期分析包括安装的每个引擎的输出。
Debug page integration 添加了自定义模板引擎。
这个 DjangoTemplates
后端通过模板获得了显式注册库和内置函数的能力 OPTIONS
.
这个 timesince
和 timeuntil
在给定大时间跨度的情况下,对过滤器进行了改进以处理闰年。
这个 include
标记现在在模板呈现期间缓存解析的模板对象,加快了在循环等位置的重用。
增加了 json()
方法来测试客户端响应,以将响应主体作为JSON授予访问权限。
增加了 force_login()
测试客户端的方法。使用此方法模拟用户登录站点的效果,同时跳过的身份验证和验证步骤 login()
.
现在在URL模式中允许使用正则表达式lookaround断言。
现在可以使用 app_name
包含的模块或对象的属性。也可以通过将两个元组(<list of patterns>,<application namespace>)作为第一个参数传递给 include()
.
添加了常见URL模式错误的系统检查。
补充 django.core.validators.int_list_validator()
生成包含用自定义字符分隔的整数的字符串的验证器。
EmailValidator
现在将域名标签的长度限制为每个字符63个字符 RFC 1034 .
补充 validate_unicode_slug()
验证可能包含Unicode字符的段塞。
警告
除了本节概述的更改外,请务必查看 1.9中删除的功能 对于已达到折旧周期结束并因此被移除的功能。如果您没有在取消预测时间线内更新给定功能的代码,则删除该功能可能会显示为向后不兼容的更改。
一些新的测试依赖于后端对列默认值进行自省的能力(将结果返回为 Field.default
)您可以设置 can_introspect_default
数据库功能到 False
如果你的后端没有实现这一点。您可能希望查看Django包含的后端实现,以供参考。 (#24245 )
在db-api模块级别注册全局适配器或转换器,以处理 datetime
对于不支持时区的数据库,不鼓励将值作为查询参数传递或作为查询结果返回。它可能与其他类库发生冲突。
向添加时区的推荐方法 datetime
从数据库中获取的值是为 DateTimeField
在里面 DatabaseOperations.get_db_converters()
.
这个 needs_datetime_string_cast
数据库功能已删除。设置它的数据库后端必须注册一个转换器,如上所述。
这个 DatabaseOperations.value_to_db_<type>()
方法已重命名为 adapt_<type>field_value()
镜像 convert_<type>field_value()
方法。
使用新的 date
查找,第三方数据库后端可能需要实现 DatabaseOperations.datetime_cast_date_sql()
方法。
这个 DatabaseOperations.time_extract_sql()
方法已添加。它调用现有的 date_extract_sql()
方法。此方法被sqlite后端重写,以便将时间查找(小时、分钟、秒)添加到 TimeField
第三方数据库后端可能需要。
这个 DatabaseOperations.datetime_cast_sql()
方法(不要与 DatabaseOperations.datetime_cast_date_sql()
已删除。这个方法在1.0之前就已经在Oracle上对日期进行了格式化,但多年来没有被任何核心后端覆盖,也没有在Django的代码或测试中被调用。
为了支持测试并行化,必须实现 DatabaseCreation._clone_test_db()
方法与集合 DatabaseFeatures.can_clone_databases = True
. 你可能需要调整 DatabaseCreation.get_test_db_clone_settings()
.
中的默认设置 django.conf.global_settings
是列表和元组的组合。以前是元组的所有设置现在都是列表。
is_usable
模板加载器上的属性已删除¶Django模板加载器以前需要一个 is_usable
要定义的属性。如果在模板设置中配置了加载器并且此属性为 False
,则加载程序将被静默忽略。实际上,这只被鸡蛋加载器用来检测是否 setuptools
已经安装了。这个 is_usable
属性,则鸡蛋加载器将在运行时失败,如果 setuptools
未安装。
当使用 filesystem.Loader
或 app_directories.Loader
模板加载器,Django的早期版本引发了 TemplateDoesNotExist
如果模板源存在但无法读取,则出错。在许多情况下都可能发生这种情况,例如Django没有打开文件的权限,或者模板源是一个目录。现在,Django只会在模板源不存在时消除异常。所有其他情况都会导致 IOError
被提升。
相对重定向不再转换为绝对URI。 RFC 2616 要求 Location
重定向响应中的头为绝对URI,但已被取代 RFC 7231 允许相对URI进入 Location
,认识到用户代理的实际实践,几乎所有这些都支持它们。
因此,预期的URL传递给 assertRedirects
通常不应再包括URL的方案和域部分。例如, self.assertRedirects(response, 'http://testserver/some-url/')
应改为 self.assertRedirects(response, '/some-url/')
(除非重定向特别包含绝对URL)。
在罕见的情况下,您需要旧的行为(发现与古代版本的Apache with mod_scgi
这将相对重定向解释为“内部重定向”),您可以通过编写自定义中间件来恢复它:
class LocationHeaderFix(object):
def process_response(self, request, response):
if "Location" in response:
response["Location"] = request.build_absolute_uri(response["Location"])
return response
PostgreSQL 9.0的上游支持于2015年9月结束。因此,django 1.9将9.1设置为它正式支持的最小PostgreSQL版本。
对Oracle 11.1的上游支持于2015年8月结束。因此,Django1.9将11.2设置为它正式支持的最低Oracle版本。
LoaderOrigin
和 StringOrigin
被移除¶在Django的早期版本中,当模板引擎以debug as初始化时 True
,的实例 django.template.loader.LoaderOrigin
或 django.template.base.StringOrigin
被设置为模板对象的原始属性。这些课程被合并成 Origin
现在,无论引擎调试设置如何,都会设置。为了实现最小程度的向后兼容性,旧类名将保留为新类名的别名。 Origin
在Django 2.0之前上课。
为了便于编写自定义日志配置,Django的默认日志配置不再定义 django.request
和 django.security
伐木工人。相反,它定义了一个 django
记录器,在 INFO
级别,有两个处理程序:
console
:过滤 INFO
水平,只有在 DEBUG=True
.
mail_admins
:过滤 ERROR
水平,只有在 DEBUG=False
.
如果您没有覆盖django的默认日志记录,您应该看到行为的最小变化,但是您可能会看到一些新的日志记录到 runserver
例如,控制台。
如果您要覆盖Django的默认日志记录,您应该检查配置如何与新的默认值合并。
HttpRequest
错误报告中的详细信息¶显示 HttpRequest
每次它作为堆栈帧变量出现在HTML版本的调试页和错误电子邮件中。因此,HTTP请求现在将显示与其他变量相同的标准表示形式。 (repr(request)
)因此, ExceptionReporterFilter.get_request_repr()
方法和未登记的 django.http.build_request_repr()
功能被删除。
修改了电子邮件文本版本的内容,以提供与Ajax请求相同结构的回溯。回溯细节由 ExceptionReporter.get_traceback_text()
方法。
Django不再注册用于管理时区信息的全局适配器和转换器 datetime
作为查询参数发送到数据库或从查询结果中的数据库中读取的值。此更改会影响满足以下所有条件的项目:
这个 USE_TZ
设置是 True
.
数据库是sqlite、mysql、oracle或不支持时区的第三方数据库。如果有疑问,您可以检查 connection.features.supports_timezones
.
代码在ORM外部查询数据库,通常使用 cursor.execute(sql, params)
.
如果你路过,注意 datetime
这些查询的参数,您应该将其转换为使用UTC的原始日期时间:
from django.utils import timezone
param = timezone.make_naive(param, timezone.utc)
如果不这样做,转换将像在早期版本中那样执行(带有拒绝警告),直到django 1.11。Django2.0不会执行任何转换,这可能导致数据损坏。
如果你在读书 datetime
从结果中得出的价值观,他们将是幼稚的而不是清醒的。你可以补偿如下:
from django.utils import timezone
value = timezone.make_aware(value, timezone.utc)
如果通过ORM查询数据库,即使使用 raw()
查询。ORM负责管理时区信息。
这个 DjangoTemplates
后端现在在实例化时对已安装的模板标记模块执行发现。此更新使库能够通过 'libraries'
关键 OPTIONS
定义一个 DjangoTemplates
后端。模板标记模块中的导入或语法错误现在在实例化时早期失败,而不是在模板具有 {{% load %}}
首先编译标记。
django.template.base.add_to_builtins()
被移除¶虽然它是一个私有的API,但通常使用的项目 add_to_builtins()
使模板标记和过滤器不使用 {{% load %}}
标签。此API已正式化。项目现在应该通过 'builtins'
关键 OPTIONS
定义一个 DjangoTemplates
后端。
simple_tag
now wraps tag output in conditional_escape
¶通常,模板标记不会自动转义其内容,并且此行为是 documented . 对于标签类 inclusion_tag
,这不是问题,因为包含的模板将执行自动转义。为了 assignment_tag()
,当输出用作模板中的变量时,将对其进行转义。
用于 simple_tag
但是,很容易以错误的HTML和可能的XSS漏洞结束。例如::
@register.simple_tag(takes_context=True)
def greeting(context):
return "Hello {0}!".format(context["request"].user.first_name)
在旧版本的Django中,这将是一个XSS问题,因为 user.first_name
没有逃脱。
在django 1.9中,这是固定的:如果模板上下文 autoescape=True
设置(默认),然后 simple_tag
将标记函数的输出包装为 conditional_escape()
.
修复你的 simple_tag
S,最好采用以下做法:
生成HTML的任何代码都应该使用模板系统或 format_html()
.
如果A的输出 simple_tag
需要逃运行,使用 escape()
或 conditional_escape()
.
如果您完全确定要从受信任的源(例如,存储管理员输入的HTML的CMS字段)输出HTML,则可以使用 mark_safe()
.
无论在django 1.9+或更早版本上运行,遵循这些规则的标签都是正确和安全的。
Paginator.page_range
¶Paginator.page_range
现在是迭代器而不是列表。
在1.8之前的Django版本中, Paginator.page_range
返回A list
在python 2和a中 range
在Python 3中。Django1.8始终返回一个列表,但迭代器更高效。
依赖于的现有代码 list
通过将迭代器转换为 list
使用 list()
.
QuerySet
__in
查找删除¶在早期版本中,查询如下:
Model.objects.filter(related_id=RelatedModel.objects.all())
将隐式转换为::
Model.objects.filter(related_id__in=RelatedModel.objects.all())
导致类似SQL的 "related_id IN (SELECT id FROM ...)"
.
这个隐含的 __in
不再发生,所以“in”SQL现在为“=”,并且如果子查询返回多个结果,那么至少有些数据库会抛出一个错误。
contrib.admin
浏览器支持¶管理员不再支持Internet Explorer 8及以下版本,因为这些浏览器已达到使用寿命。
支持Internet Explorer 6和7的CSS和图像已被删除。PNG和GIF图标已替换为SVG图标,Internet Explorer 8及更早版本不支持SVG图标。
嵌入在管理中的jQuery库已从1.11.2版升级到2.1.4版。JQuery 2.x具有与jQuery 1.x相同的API,但不支持Internet Explorer 6、7或8,从而允许更好的性能和更小的文件大小。如果您需要支持IE8并且还必须使用最新版本的Django,您可以使用您自己的版本覆盖管理员的jQuery副本,方法是创建一个Django应用程序,其结构如下:
app/static/admin/js/vendor/
jquery.js
jquery.min.js
SyntaxError
安装Django时 setuptools
5.5.x¶使用安装Django 1.9或1.9.1时 setuptools
5.5.x,您将看到:
Compiling django/conf/app_template/apps.py ...
File "django/conf/app_template/apps.py", line 4
class {{ camel_case_app_name }}Config(AppConfig):
^
SyntaxError: invalid syntax
Compiling django/conf/app_template/models.py ...
File "django/conf/app_template/models.py", line 1
{{ unicode_literals }}from django.db import models
^
SyntaxError: invalid syntax
忽略这些错误是安全的(Django仍将安装得很好),但您可以通过升级来避免它们 setuptools
升级到更新的版本。如果您正在使用pip,您可以使用以下命令升级pip python -m pip install -U pip
它也将升级 setuptools
。在更高版本的Django中解决了这一问题,如 Django 1.9.2发行说明 。
中的jquery静态文件 contrib.admin
已经被转移到 vendor/jquery
子目录。
为管理员更改列表中的空列显示的文本 list_display
单元格已从更改 (None)
(或其翻译的等效物)至 -
(破折号)
django.http.responses.REASON_PHRASES
和 django.core.handlers.wsgi.STATUS_CODE_TEXT
已经被移除了。请改用Python的标准库: http.client.responses
对于Python3和 httplib.responses 对于Python2。
ValuesQuerySet
和 ValuesListQuerySet
已被删除。
这个 admin/base.html
模板不再设置 window.__admin_media_prefix__
或 window.__admin_utc_offset__
. javascript中使用该值构建绝对URL的图像引用已移动到CSS中,以便于自定义。UTC偏移量存储在 <body>
标签。
CommaSeparatedIntegerField
已对验证进行了优化,以禁止类似的值 ','
, ',1'
和 '1,,2'
.
表单初始化已从 ProcessFormView.get()
新方法 FormMixin.get_context_data()
方法。如果您重写了 get_context_data()
不调用的方法 super()
.
对Postgis 1.5的支持已被放弃。
这个 django.contrib.sites.models.Site.domain
字段已更改为 unique
.
为了强制测试隔离,默认情况下不允许数据库查询 SimpleTestCase
不再测试了。您可以通过设置 allow_database_queries
类属性 True
在你的测试课上。
ResolverMatch.app_name
已更改为包含嵌套命名空间的完整命名空间路径。为了与…保持一致 ResolverMatch.namespace
,空值现在是空字符串,而不是 None
.
为了加强安全性,会话密钥必须至少为8个字符。
私人职能 django.utils.functional.total_ordering()
已删除。它包含一个 functools.total_ordering()
在2.7.3之前的python版本中出现错误。
XML序列化(通过 dumpdata
或联合框架)用于输出接收到的任何字符。现在,如果要序列化的内容包含XML 1.0标准中不允许的任何控制字符,则序列化将失败,并返回 ValueError
.
经过翻译并使用两个或更多连续百分号的模板文本,例如 "%%"
,可能有新的 msgid
之后 makemessages
正在运行(翻译很可能会标记为模糊)。新 msgid
将被标记 "#, python-format"
。
如果既不 request.current_app
也不 Context.current_app
被设置为 url
模板标记现在将使用当前请求的命名空间。集合 request.current_app
到 None
如果不想使用名称空间提示。
这个 SILENCED_SYSTEM_CHECKS
现在设置将使所有级别的消息静音。以前,消息 ERROR
级别或更高级别被打印到控制台。
这个 FlatPage.enable_comments
字段从中删除 FlatPageAdmin
因为它没有被应用程序使用。如果您的项目或第三方应用程序使用它, create a custom ModelAdmin 把它加回来。
的返回值 setup_databases()
第一个论点是 teardown_databases()
改变。他们曾经是 (old_names, mirrors)
元组。现在他们只是第一个项目, old_names
.
默认情况下 LiveServerTestCase
尝试在8081-8179范围内查找可用端口,而不仅仅是尝试端口8081。
系统检查 ModelAdmin
现在检查实例而不是类。
由于性能原因,用于应用混合迁移计划的私有API已被删除。混合计划包括一个迁移列表,其中一些正在应用,而另一些则未应用。
中的相关模型对象描述符类 django.db.models.fields.related
(私有API)从 related
模块到 related_descriptors
并更名如下:
ReverseSingleRelatedObjectDescriptor
is ForwardManyToOneDescriptor
SingleRelatedObjectDescriptor
is ReverseOneToOneDescriptor
ForeignRelatedObjectsDescriptor
is ReverseManyToOneDescriptor
ManyRelatedObjectsDescriptor
is ManyToManyDescriptor
如果实现自定义 handler404
视图,它必须返回带有HTTP 404状态代码的响应。使用 HttpResponseNotFound
或通行证 status=404
到 HttpResponse
. 否则, APPEND_SLASH
无法正常工作 DEBUG=False
.
assignment_tag()
¶Django 1.4增加了 assignment_tag
帮助器,以便于创建存储模板变量结果的模板标记。这个 simple_tag()
助手获得了同样的能力,使得 assignment_tag
过时的。使用的标签 assignment_tag
应该更新以使用 simple_tag
.
{{% cycle %}}
带逗号分隔参数的语法¶这个 cycle
标记支持以前的django版本中较低的旧语法:
{% cycle row1,row2,row3 %}
它的解析导致了当前语法的错误,因此在Django1.10中,对旧语法的支持将在加速的降级之后被删除。
ForeignKey
和 OneToOneField
on_delete
参数¶为了提高对级联模型删除的认识,需要 on_delete
的参数 ForeignKey
和 OneToOneField
在Django 2.0中需要。
更新模型和现有迁移以显式设置参数。因为默认值是 models.CASCADE
,添加 on_delete=models.CASCADE
对所有 ForeignKey
和 OneToOneField
这不是一个不同的选择。如果不关心与Django旧版本的兼容性,也可以将其作为第二个位置参数传递。
Field.rel
变化¶Field.rel
它的方法和属性已经改变以匹配相关的字段api。这个 Field.rel
属性重命名为 remote_field
它的许多方法和属性要么被更改要么被重命名。
这些更改的目的是为关系字段提供文档化的API。
GeoManager
和 GeoQuerySet
自定义方法¶所有习俗 GeoQuerySet
方法 (area()
, distance()
, gml()
,…)已被注释中的等效地理表达式替换(请参见新功能)。因此需要设置自定义 GeoManager
到现在,支持地理信息系统的模型已经过时了。只要代码不调用任何不推荐使用的方法,就可以简单地删除 objects = GeoManager()
从你的模型线条。
Django模板加载器已更新,以允许递归模板扩展。此更改需要新的模板加载器API。老年人 load_template()
和 load_template_sources()
方法现在已弃用。可以找到有关新API的详细信息 in the template loader documentation .
app_name
到 include()
¶将元组作为参数传递给的实例命名空间部分 include()
已被替换为通过 namespace
参数 include()
. 例如::
polls_patterns = [
url(...),
]
urlpatterns = [
url(r"^polls/", include((polls_patterns, "polls", "author-polls"))),
]
变成::
polls_patterns = (
[
url(...),
],
"polls",
) # 'polls' is the app_name
urlpatterns = [
url(r"^polls/", include(polls_patterns, namespace="author-polls")),
]
这个 app_name
参数 include()
已被替换为传递2元组(如上所述),或者传递带有 app_name
属性(如下)。如果 app_name
是以这种新的方式设置的, namespace
不再需要参数。它将默认为 app_name
. 例如,教程中的URL模式从以下位置更改为:
mysite/urls.py
¶urlpatterns = [url(r"^polls/", include("polls.urls", namespace="polls")), ...]
到:
mysite/urls.py
¶urlpatterns = [
url(r"^polls/", include("polls.urls")), # 'namespace="polls"' removed
...,
]
polls/urls.py
¶app_name = "polls" # added
urlpatterns = [...]
这一变化也意味着旧的包含方式 AdminSite
实例已被弃用。相反,通过 admin.site.urls
直接向 django.conf.urls.url()
:
urls.py
¶from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r"^admin/", admin.site.urls),
]
在过去,没有应用程序命名空间的实例命名空间与应用程序命名空间具有相同的用途,但如果存在同名的应用程序命名空间,则无法反转模式。指定实例命名空间的include要求包含的urlconf设置应用程序命名空间。
current_app
参数到 contrib.auth
意见¶中的所有视图 django.contrib.auth.views
具有以下结构:
def view(request, ..., current_app=None, ...):
...
if current_app is not None:
request.current_app = current_app
return TemplateResponse(request, template_name, context)
截至Django 1.8, current_app
设置在 request
对象。为了保持一致性,这些视图将要求调用者设置 current_app
上 request
而不是在单独的参数中传递它。
django.contrib.gis.geoip
¶这个 django.contrib.gis.geoip2
模块取代 django.contrib.gis.geoip
. 新模块提供了一个类似的API,只是它不提供传统的geoip-python-api兼容性方法。
这个 weak
参数 django.dispatch.signals.Signal.disconnect()
已被弃用,因为它没有效果。
这个 check_aggregate_support()
方法 django.db.backends.base.BaseDatabaseOperations
已弃用,将在Django 2.0中删除。更一般的 check_expression_support()
应该改为使用。
django.forms.extras
被贬低。你可以找到 SelectDateWidget
在里面 django.forms.widgets
(或者简单地 django.forms
相反。
私有API django.db.models.fields.add_lazy_relation()
被贬低。
这个 django.contrib.auth.tests.utils.skipIfCustomUser()
decorator已弃用。随着django 1.6中的测试发现更改,对 django.contrib
应用程序不再作为用户项目的一部分运行。因此, @skipIfCustomUser
修饰符不再需要装饰测试 django.contrib.auth
.
如果你定制了一些 error handlers ,不推荐使用只有一个请求参数的视图签名。现在视图也应该接受一秒钟 exception
位置参数。
这个 django.utils.feedgenerator.Atom1Feed.mime_type
和 django.utils.feedgenerator.RssFeed.mime_type
属性已弃用,取而代之的是 content_type
.
Signer
如果使用了无效分隔符,则会发出警告。这将成为Django 1.10的一个例外。
django.db.models.Field._get_val_from_obj()
被否决,赞成 Field.value_from_object()
.
django.template.loaders.eggs.Loader
不推荐使用,因为不推荐使用鸡蛋来分发应用程序。
这个 callable_obj
关键字参数 SimpleTestCase.assertRaisesMessage()
被贬低。将可调用项作为位置参数传递。
这个 allow_tags
方法的属性 ModelAdmin
已弃用。使用 format_html()
, format_html_join()
或 mark_safe()
当构造方法的返回值时。
这个 enclosure
关键字参数 SyndicationFeed.add_item()
被贬低。使用新的 enclosures
接受列表的参数 Enclosure
对象而不是单个对象。
这个 django.template.loader.LoaderOrigin
和 django.template.base.StringOrigin
用于别名 django.template.base.Origin
被贬低。
这些功能已达到其折旧周期的末尾,并在Django 1.9中删除。见 1.7中不推荐的功能 有关详细信息,包括如何删除这些功能的用法。
django.utils.dictconfig
被移除。
django.utils.importlib
被移除。
django.utils.tzinfo
被移除。
django.utils.unittest
被移除。
这个 syncdb
命令被删除。
django.db.models.signals.pre_syncdb
和 django.db.models.signals.post_syncdb
被移除。
支持 allow_syncdb
数据库上的路由器被删除。
已删除不迁移的应用程序的自动同步。除非通过 migrate --run-syncdb
选择权。
用于不进行迁移的应用程序的SQL管理命令, sql
, sqlall
, sqlclear
, sqldropindexes
和 sqlindexes
被移除。
支持自动加载 initial_data
将删除设备和初始SQL数据。
所有模型都需要在已安装的应用程序中定义,或者声明一个显式的 app_label
. 此外,不可能在加载应用程序之前导入它们。尤其是,不可能在应用程序的根包中导入模型。
模型和形式 IPAddressField
被移除。stub字段保持与历史迁移的兼容性。
AppCommand.handle_app()
不再支持。
RequestSite
和 get_current_site()
不再可以从 django.contrib.sites.models
.
通过 runfcgi
删除管理命令。
django.utils.datastructures.SortedDict
被移除。
ModelAdmin.declared_fieldsets
被移除。
这个 util
提供向后兼容性的模块将被删除:
django.contrib.admin.util
django.contrib.gis.db.backends.util
django.db.backends.util
django.forms.util
ModelAdmin.get_formsets
被移除。
引入向后兼容垫片来重命名 BaseMemcachedCache._get_memcache_timeout()
方法到 get_backend_timeout()
被移除。
这个 --natural
和 -n
选项 dumpdata
被移除。
这个 use_natural_keys
的参数 serializers.serialize()
被移除。
私有API django.forms.forms.get_declared_fields()
被移除。
使用 SplitDateTimeWidget
具有 DateTimeField
被移除。
这个 WSGIRequest.REQUEST
属性被删除。
类 django.utils.datastructures.MergeDict
被移除。
这个 zh-cn
和 zh-tw
删除语言代码。
内部 django.utils.functional.memoize()
被移除。
django.core.cache.get_cache
被移除。
django.db.models.loading
被移除。
无法再将可调用参数传递给查询集。
BaseCommand.requires_model_validation
以利于 requires_system_checks
. 管理员验证程序由管理员检查替换。
这个 ModelAdmin.validator_class
和 default_validator_class
属性被删除。
ModelAdmin.validate()
被移除。
django.db.backends.DatabaseValidation.validate_field
以利于 check_field
方法。
这个 validate
删除管理命令。
django.utils.module_loading.import_by_path
以利于 django.utils.module_loading.import_string
.
ssi
和 url
模板标记将从 future
模板标记库。
django.utils.text.javascript_quote()
被移除。
数据库测试设置作为数据库设置中的独立项,前缀为 TEST_
不再支持。
这个 cache_choices
选项以 ModelChoiceField
和 ModelMultipleChoiceField
被移除。
的默认值 RedirectView.permanent
属性已从更改 True
到 False
.
django.contrib.sitemaps.FlatPageSitemap
以利于 django.contrib.flatpages.sitemaps.FlatPageSitemap
.
私有API django.test.utils.TestTemplateLoader
被移除。
这个 django.contrib.contenttypes.generic
模块被移除。
7月 22, 2024