Django 1.8 release notes

2015年4月1日

欢迎来到Django 1.8!

这些发行说明涵盖新功能以及一些向后不兼容更改,您需要知道从Django 1.7或更早版本升级时。我们还开始了对某些功能的弃用过程,某些功能已达到其弃用过程的结束,已删除

Django 1.8已被指定为Django的第二个“Long-Term Support” (LTS)版本。它将在其发布后至少三年内收到安全更新。支持以前的LTS,Django 1.4,将从发布Django 1.8的6个月结束。

Python compatibility

与Django 1.7一样,Django 1.8需要Python 2.7或更高版本,但我们强烈推荐最新的小版本。

What’s new in Django 1.8

Model._meta API

Django现在有一个用于Model._meta的正式API,它提供了正式支持的retrieve fields和基于它们的attributes

从0.96“魔法删除”之前的日子开始,Model._meta对象已经成为Django的一部分 - 它不是一个官方的,稳定的API。在认识到这一点,我们努力在可能的情况下保持与旧的API端点的向后兼容性。但是,不是新的官方API一部分的API端点已被弃用,最终将被删除。已提供guide to migrating from the old API to the new API的指南。

Multiple template engines

Django 1.8定义了一个用于集成模板后端的稳定API。它包括对Django模板语言和Jinja2的内置支持。它支持在同一项目中使用多个引擎渲染模板。有关详情,请参阅topic guide中的新功能,并查看upgrade instructions

Security enhancements

Several features of the django-secure third-party library have been integrated into Django. django.middleware.security.SecurityMiddleware为请求/响应周期提供了几种安全增强功能。check命令的新--deploy选项允许您检查生产设置文件,以了解如何提高站点的安全性。

New PostgreSQL specific functionality

Django现在有一个具有PostgreSQL特定功能扩展的模块,如ArrayFieldHStoreFieldRange Fieldsunaccent功能的完整细目可在文档中找到in the documentation

New data types

  • Django现在有一个UUIDField用于存储通用唯一标识符。它作为本地uuid数据类型存储在PostgreSQL上,并作为固定长度字符字段存储在其他后端。有相应的form field
  • Django现在有一个DurationField用于存储时间 - 由timedelta在Python中建模。它存储在PostgreSQL上的本机interval数据类型中,作为INTERVAL DAY(9) TO t5 > SECOND(6),而在其他后端则为bigint日期和时间相关的算术也已在所有后端改进。有相应的form field

Query Expressions, Conditional Expressions, and Database Functions

Query Expressions允许您创建,自定义和组合复杂的SQL表达式。这已启用注释接受除聚合以外的表达式。聚合现在能够引用多个字段,以及执行算术,类似于F()对象。order_by() has also gained the ability to accept expressions.

Conditional Expressions允许您在查询中使用if ... elif ... else

database functions的集合也包括在诸如CoalesceConcatSubstr等功能中。

TestCase data setup

TestCase已重构,以允许在类级别使用事务和保存点进行数据初始化。不支持事务的数据库后端,例如MySQL和MyISAM存储引擎,仍然能够运行这些测试,但不会从改进中受益。测试现在在两个嵌套的atomic()块中运行:一个用于整个类,一个用于每个测试。

  • 类方法TestCase.setUpTestData()增加了在类级别设置测试数据的能力。与使用setUp()相比,使用此技术可以加快测试速度。
  • 对于整个TestCase,在TestCase内的夹具加载现在执行一次。

Minor features

django.contrib.admin

  • ModelAdmin现在具有has_module_permission()方法,以允许在管理索引页面上限制对模块的访问。
  • InlineModelAdmin现在具有属性show_change_link,支持显示到内联对象的更改表单的链接。
  • 使用ModelAdmin.list_filter中的新django.contrib.admin.RelatedOnlyFieldListFilterlist_filter选项限制为附加到来自ModelAdmin
  • ModelAdmin.delete_view()在删除确认页面上显示要删除的对象的摘要。
  • 嵌入在管理中的jQuery库已升级到1.11.2版本。
  • 您现在可以指定AdminSite.site_url,以便显示指向前端网站的链接。
  • 您现在可以指定ModelAdmin.show_full_result_count以控制是否应在过滤的管理页面上显示对象的完整计数。
  • AdminSite.password_change()方法现在具有extra_context参数。
  • 您现在可以通过仅覆盖AdminSite.has_permission()AdminSite.login_form来控制哪些人可以登录到管理网站。base.html模板有一个新的块usertools,其中包含用户特定的标题。新的上下文变量has_permission,从has_permission()获得其值,指示用户是否可以访问该站点。
  • 外键下拉菜单现在有用于使用弹出窗口更改或删除相关对象的按钮。

django.contrib.admindocs

  • reStructuredText现在在模型docstrings中解析。

django.contrib.auth

django.contrib.gis

  • 新的GeoJSON serializer现已可用。
  • 现在允许包含子查询作为地理查找参数,例如City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly'))
  • 当数据库版本为3.0或更高版本时,Spatialite后端现在支持CollectExtent聚合。
  • PostGIS 2 CREATE EXTENSION postgis和Spatialite SELECT InitSpatialMetaData初始化命令现在由migrate自动运行。
  • GDAL界面现在支持检索raster (image) data file的属性。
  • 已删除Django 1.2中更改的SpatialRefSysGeometryColumns的兼容性垫片。
  • 现在,所有与GDAL相关的异常都会通过GDALException引发。前者OGRException已保留用于向后兼容性,但不应再使用。

django.contrib.sessions

  • 会话cookie现在在flush()被调用后删除。

django.contrib.sitemaps

django.contrib.sites

Cache

  • django.core.cache.backends.locmem.LocMemCache后端的incr()方法现在是线程安全的。

Cryptography

Database backends

  • MySQL后端不再从datetime值中剥离微秒,因为MySQL 5.6.4及更高版本支持小数秒,具体取决于datetime字段的声明(当DATETIME包含小于等于0)。使用Django 1.8和MySQL 5.6.4及更高版本创建的新datetime数据库列将支持微秒。有关详细信息,请参阅MySQL database notes
  • 当使用InnoDB存储引擎时,MySQL后端不再为外键创建明确的索引,因为MySQL已经自动创建它们。
  • Oracle后端不再将connection_persists_old_columns功能定义为True相反,当获取表的描述时,Oracle现在将包含一个缓存无效化子句。

Email

File Storage

  • Storage.get_available_name()Storage.save()现在采用max_length参数来实现存储级别最大文件名长度约束。超过此参数的文件名将被截断。这可以防止在将唯一后缀附加到存储上已存在的长文件名时出现数据库错误。有关将此参数添加到自定义存储类的信息,请参阅deprecation note

Forms

  • 窗体小部件现在将属性值为TrueFalse作为HTML5布尔属性。
  • 新的has_error()方法允许检查是否发生了特定错误。
  • 如果在表单上定义了required_css_class,则用于所需字段的<label>标签将在其属性中出现此类。
  • 在无序列表(<ul>)中呈现非字段错误现在在其类列表中包括nonfield,以将它们与字段特定错误区分开。
  • Field现在接受label_suffix参数,它将覆盖表单的label_suffix这使得可以在每个字段基础上自定义后缀 - 以前在使用快捷方式(例如{{ )时不可能覆盖表单的label_suffix form.as_p }}
  • SelectDateWidget现在接受empty_label参数,当不需要DateField时,将覆盖顶部列表选项标签。
  • 在清除并验证ImageField之后,UploadedFile对象将具有包含Pillow Image的附加image实例用于检查文件是否是有效的图像。它还将更新UploadedFile.content_type,其中图像的内容类型由Pillow确定。
  • 现在,您可以传递一个可调用项,用于在实例化ChoiceField时返回可选择的可迭代项。

Generic Views

Internationalization

  • FORMAT_MODULE_PATH现在可以是表示模块路径的字符串列表。这允许从不同的可重用应用程序导入几个格式模块。它还允许在您的主Django项目中覆盖这些自定义格式。

Logging

Management Commands

  • 在从命令行调用的管理命令完成其作业后,数据库连接现在总是关闭。
  • 来自替代包格式(如鸡蛋)的命令现在也被发现。
  • dumpdata现在具有选项--output,其允许指定被写入串行化数据的文件。
  • makemessagescompilemessages现在具有选项--exclude,允许从处理中排除特定语言环境。
  • compilemessages现在具有--use-fuzzy-f选项,其中包括模糊翻译为已编译文件。
  • loaddata管理命令的--ignorenonexistent选项现在会忽略不再存在的模型的数据。
  • runserver现在使用守护线程更快地重新加载。
  • inspectdb现在输出Meta.unique_together它还能够自省AutoField用于MySQL和PostgreSQL数据库。
  • inspectdb现在内省了所有数据库后端的数据库视图。在以前的版本中,仅检查表(而不是视图)。
  • 当通过call_command和传递选项从代码调用管理命令时,选项名称可以匹配命令行选项名称(没有初始破折号)或最终选项目标变量名称,但在任一情况下,选项现在始终是命令选项定义中指定的dest名称(只要该命令使用新的argparse模块)。
  • dbshell命令现在支持MySQL的可选SSL证书颁发机构设置(--ssl-ca)。
  • makemigrations--name选项允许您为迁移提供自定义名称,而不是生成的名称。
  • loaddata命令现在可以防止反复夹具加载。如果FIXTURE_DIRS包含重复项或默认夹具目录路径(app_name/fixtures),则会引发异常。
  • makemigrations现在支持使用错误代码退出的--exit选项(如果未创建迁移)。
  • 新的showmigrations命令允许列出项目中的所有迁移及其依赖项。

Middleware

Migrations

Models

  • Django现在在connections.queries中记录最多9000个查询,以防止在调试模式下长时间运行的进程中过多的内存使用。
  • 现在有一个模型Meta选项定义所有的default related name模型的关系字段。
  • 不同版本的Django之间的pickling模型和查询没有官方支持(它可能工作,但不能保证)。指定当前Django版本的额外变量现在被添加到模型和查询集的腌制状态,当这些对象以与它们被酸洗的不同的版本取消包装时,Django提出RuntimeWarning
  • 添加Model.from_db() Django在使用ORM加载对象时使用。该方法允许定制模型加载行为。
  • extra(select={...})现在允许您使用%%s转义文字%s序列。
  • Custom Lookups现在可以使用装饰器模式进行注册。
  • 新的Transform.bilateral属性允许创建双向转换。当在查找表达式中使用时,这些变换适用于lhsrhs,从而为更复杂的查找提供机会。
  • SQL特殊字符(,%,_)现在在模式查找时正确转义。containsstartswith等)F()表达式一起使用,作为右侧。在这些情况下,转义由数据库执行,这可能导致涉及嵌套REPLACE函数调用的某些复杂查询。
  • 现在,您可以使用Model.refresh_from_db()刷新模型实例。
  • 现在,您可以使用Model.get_deferred_fields()获取模型的延迟字段集。
  • 当主键字段设置为None时,现在使用模型字段default

Signals

  • Signal.send_robust()返回的(接收者, 异常)的元组的异常现在有它们的追溯a __traceback__属性。
  • 包含请求中的WSGI环境结构的environ参数已添加到request_started信号中。
  • 您现在可以从django.core.signals导入setting_changed()信号,以避免在非测试情况下加载django.testDjango不再这样做。

System Check Framework

Templates

  • urlize现在支持包含顶级域名后面字符的纯域链接。djangoproject.com/djangoproject.com/download/)。
  • urlize不会将域末尾的感叹号或其查询字符串视为网址的一部分(例如,'djangoproject.com!djangoproject.com
  • 添加了一个从Python字典加载Django模板的locmem.Loader类。
  • now标记现在可以使用通常的语法将其输出存储在上下文变量中:{% 现在 / t6> n Y' 作为 varname %}

Requests and Responses

  • WSGIRequest现在遵守以//开头的路径。
  • HttpRequest.build_absolute_uri()方法现在可以正确处理以//开头的路径。
  • 如果DEBUGTrue且请求引发SuspiciousOperation,则响应将显示详细的错误页面。
  • QueryDictquery_string参数现在是可选的,默认为None,因此一个空白的QueryDict现在可以QueryDict()而不是QueryDict(None)QueryDict('')
  • HttpRequest对象的GETPOST属性现在为QueryDict而不是字典,FILES属性现在是MultiValueDict这使这个类符合文档和WSGIRequest
  • 已添加HttpResponse.charset属性。
  • WSGIRequestHandler现在遵循RFC,使用uri_to_iri()将URI转换为IRI。
  • HttpRequest.get_full_path()方法现在可以正确地从统一资源标识符(URI)的路径部分转义不安全的字符。
  • HttpResponse现在实现像getvalue()这样的一些附加方法,以便实例可以用作流对象。
  • 新的HttpResponse.setdefault()方法允许设置一个标题,除非它已经被设置。
  • 您可以使用新的FileResponse来流式传输文件。
  • 条件视图处理的condition()装饰器现在支持If-unmodified-since头。

Tests

Validators

  • URLValidator现在支持IPv6地址,unicode域和包含身份验证数据的URL。

Backwards incompatible changes in 1.8

警告

除了本节中概述的更改外,请务必查看已删除的任何功能的deprecation plan如果您没有在指定功能的弃用时间轴内更新代码,则其移除可能会显示为向后不兼容的更改。

Assigning unsaved objects to relations raises an error

将未保存的对象分配给ForeignKeyGenericForeignKeyOneToOneField现在会引发一个ValueError

以前,未保存的对象的分配将被忽略。例如:

>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.author.save()
>>> book.save()

>>> Book.objects.get(name="Django")
>>> book.author
>>>

现在,将出现一个错误,以防止数据丢失:

>>> book.author = Author(name="john")
Traceback (most recent call last):
...
ValueError: Cannot assign "<Author: John>": "Author" instance isn't saved in the database.

如果您需要允许分配未保存的实例(旧行为),并且不关心数据丢失的可能性(例如,您从不将对象保存到数据库),可以使用allow_unsaved_instance_assignment属性禁用此检查。

Management commands that only accept positional arguments

If you have written a custom management command that only accepts positional arguments and you didn’t specify the args command variable, you might get an error like Error: unrecognized arguments: ..., as variable parsing is now based on argparse which doesn’t implicitly accept positional arguments. You can make your command backwards compatible by simply setting the args class variable. 但是,如果您不必与旧的Django版本保持兼容性,最好按照Writing custom django-admin commands中所述实施新的add_arguments()方法。

Custom test management command arguments through test runner

通过测试运行器将自定义参数添加到test管理命令的方法已更改。以前,您可以在测试运行器上提供option_list类变量,以添加更多参数(àla optparse)。Now to implement the same behavior, you have to create an add_arguments(cls, parser) class method on the test runner and call parser.add_argument to add any custom arguments, as parser is now an argparse.ArgumentParser instance.

Model check ensures auto-generated column names are within limits specified by database

长度超过数据库支持的列名称长度的字段名称可能会产生问题。例如,使用MySQL,您将遇到创建列的异常,而使用PostgreSQL,列名称将被数据库截断(您可能会在PostgreSQL日志中看到警告)。

已经引入了模型检查,以在实际创建数据库表之前更好地警告用户此场景。

如果你有一个现有的模型,其中这个检查似乎是一个假阳性,例如在PostgreSQL的名称已经被截断,只需使用db_column指定正在使用的名称。

该检查也适用于在隐式ManyToManyField.through模型中生成的列。如果遇到问题,请使用through创建显式模型,然后根据需要在其列上指定db_column

Query relation lookups now check object types

查询模型查找现在将检查传递的对象是否为正确类型,如果不是,则会引发ValueError以前,Django不在乎对象是否是正确的类型;它只是使用对象的相关字段属性(例如。id)。现在,会出现一个错误,以防止不正确的查找:

>>> book = Book.objects.create(name="Django")
>>> book = Book.objects.filter(author=book)
Traceback (most recent call last):
...
ValueError: Cannot query "<Book: Django>": Must be "Author" instance.

Default EmailField.max_length increased to 254

旧的默认75个字符max_length无法存储所有可能的符合RFC3696 / 5321的电子邮件地址。为了存储所有可能有效的电子邮件地址,max_length已增加到254个字符。您需要为受影响的模型生成和应用数据库迁移(如果您希望保留当前字段的长度,请添加max_length=75)。包括django.contrib.auth.models.User.email的迁移。

Support for PostgreSQL versions older than 9.0

2014年7月,对于PostgreSQL 8.4,上游支持期结束。因此,Django 1.8将9.0设置为它正式支持的最小PostgreSQL版本。

这也包括删除对PostGIS 1.3和1.4的支持,因为这些版本不支持在晚于8.4的PostgreSQL版本。

Django现在还需要使用Psycopg2版本2.4.5或更高版本(如果您要使用django.contrib.postgres),则需要使用2.5+。

Support for MySQL versions older than 5.5

上游支持期限的结束在2012年1月到达MySQL 5.0和2013年12月的MySQL 5.1。因此,Django 1.8将5.5设置为它正式支持的最小MySQL版本。

Support for Oracle versions older than 11.1

对于Oracle 9.2,2012年1月为Oracle 10.1,以及2013年7月为Oracle 10.2,上游支持期结束于2010年7月。因此,Django 1.8将11.1设置为它正式支持的最低Oracle版本。

Specific privileges used instead of roles for tests on Oracle

早期版本的Django将CONNECT和RESOURCE角色授予Oracle上的测试用户。这些角色已被弃用,因此Django 1.8使用特定的底层特权。这将更改主用户运行测试所需的特权(除非将项目配置为避免创建测试用户)。现在所需的确切权限在Oracle notes中有详细说明。

AbstractUser.last_login allows null values

现在,AbstractUser.last_login字段允许空值。以前,它默认为创建用户的时间,如果用户从未登录,这是误导。如果您使用默认用户(django.contrib.auth.models.User),请运行contrib.auth中包含的数据库迁移。

如果您使用的是继承自AbstractUser的自定义用户模型,则需要运行makemigrations并为包含该模型的应用生成迁移。此外,如果希望为未登录的用户将last_login设置为NULL,则可以运行此查询:

from django.db import models
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractBaseUser

UserModel = get_user_model()
if issubclass(UserModel, AbstractBaseUser):
    UserModel._default_manager.filter(
        last_login=models.F('date_joined')
    ).update(last_login=None)

django.contrib.gis

  • 支持GEOS 3.1和GDAL 1.6已被删除。
  • 支持SpatiaLite
  • 已重构GIS特定的查找以使用django.db.models.Lookup API。
  • GEOSGeometry对象的默认str表示已从WKT更改为EWKT格式(包括SRID)。由于此表示在序列化框架中使用,这意味着dumpdata输出现在将包含几何对象的SRID值。

Priority of context processors for TemplateResponse brought in line with render

TemplateResponse构造函数旨在作为render()函数的插入替换。但是,它有一点点不兼容,因为对于TemplateResponse,来自传递的上下文字典的上下文数据可能被从上下文处理器返回的上下文数据所覆盖,而对于render是另一种方式。这是一个错误,render的行为更合适,因为它允许全局定义的上下文处理器在视图中被本地覆盖。如果您依赖事实上下文数据,则可以使用上下文处理器覆盖TemplateResponse中的上下文数据,您需要更改代码。

Overriding setUpClass / tearDownClass in test cases

装饰器override_settings()modify_settings()现在用作类装饰器时在类级别。因此,当覆盖setUpClass()tearDownClass()时,应始终调用super实现。

Removal of django.contrib.formtools

formtools contrib应用程序已移动到单独的包中。django.contrib.formtools本身已被移除。文档提供migration instructions

新包可以在Github和PyPI上找到

Database connection reloading between tests

Django先前在TestCase中关闭了每个测试之间的数据库连接。这不再是这样的,因为Django现在在一个事务中包装整个TestCase如果你的一些测试依赖于旧的行为,你应该让它们继承自TransactionTestCase

Cleanup of the django.template namespace

如果您一直依赖于django.template模块中公开的私有API,则可能需要从django.template.base导入它们。

还有私有API django.template.base.compile_string()django.template.loader.find_template()django.template.loader.get_template_from_string()已删除。

model attribute on private model relations

在早期版本的Django中,在具有反向外键关系的模型上(例如),model._meta.get_all_related_objects()将关系作为django.db.models.related.RelatedObjectmodel属性设置为关系的源。现在,此方法返回django.db.models.fields.related.ManyToOneRel(私有API RelatedObject已删除)和model源模型可以在related_model属性上访问。

考虑Django 1.8中的教程中的这个例子:

>>> p = Poll.objects.get(pk=1)
>>> p._meta.get_all_related_objects()
[<ManyToOneRel: polls.choice>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Poll'>
>>> p._meta.get_all_related_objects()[0].related_model
<class 'polls.models.Choice'>

并将其与旧版本的行为进行比较:

>>> p._meta.get_all_related_objects()
[<RelatedObject: polls:choice related to poll>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Choice'>

要访问源模型,可以使用这样的模式来编写将与Django 1.8和旧版本一起使用的代码:

for relation in opts.get_all_related_objects():
    to_model = getattr(relation, 'related_model', relation.model)

另请注意,get_all_related_objects()在1.8中已弃用。有关新API,请参见upgrade guide

Database backend API

记录了对数据库后端API的以下更改,以帮助编写第三方后端更新其代码:

  • BaseDatabaseXXX类已移至django.db.backends.base请从新位置导入它们:

    from django.db.backends.base.base import BaseDatabaseWrapper
    from django.db.backends.base.client import BaseDatabaseClient
    from django.db.backends.base.creation import BaseDatabaseCreation
    from django.db.backends.base.features import BaseDatabaseFeatures
    from django.db.backends.base.introspection import BaseDatabaseIntrospection
    from django.db.backends.base.introspection import FieldInfo, TableInfo
    from django.db.backends.base.operations import BaseDatabaseOperations
    from django.db.backends.base.schema import BaseDatabaseSchemaEditor
    from django.db.backends.base.validation import BaseDatabaseValidation
    
  • data_typesdata_types_suffixdata_type_check_constraints属性已从DatabaseCreation类转移到DatabaseWrapper

  • SQLCompiler.as_sql()方法现在采用subquery参数(#24164)。

  • BaseDatabaseOperations.date_interval_sql()方法现在只需要一个timedelta参数。

django.contrib.admin

  • AdminSite不再需要参数app_name,且其app_name属性已删除。应用程序名称始终为admin(与您仍然可以使用AdminSite(name="...")自定义的实例名称相对)。
  • ModelAdmin.get_object()方法(私有API)现在采用名为from_field的第三个参数,以便指定哪个字段应与提供的object_id
  • ModelAdmin.response_delete()方法现在采用名为obj_id的第二个参数,它是用于在删除之前检索对象的序列化标识符。

Default autoescaping of functions in django.template.defaultfilters

为了使得在使用Python代码调用HTML时“输出HTML”时输出HTML的内置模板过滤器,django.template.defaultfilters中的以下函数已更改为自动转义其输入值:

  • join
  • linebreaksbr
  • linebreaks_filter
  • linenumbers
  • unordered_list
  • urlize
  • urlizetrunc

如果您要传递信任的内容,可以通过指定autoescape=False来还原为旧的行为。在模板中使用相应的过滤器时,此更改不会有任何影响。

Miscellaneous

  • connections.queries现在是只读属性。
  • 数据库连接只有在它们是相同的对象时才被视为相等。它们不再hashable。
  • GZipMiddleware用于在请求来自Internet Explorer时禁用某些内容类型的压缩,以解决IE6及更早版本中的错误。此行为可能会影响IE7及更高版本的性能。它被删除。
  • URLField.to_python不再为无pathless网址添加尾部斜杠。
  • 对于未定义的变量,length模板过滤器现在返回0,而不是空字符串。
  • ForeignKey.default_error_message['invalid']已从'%(model)s 实例 更改为 t5 > pk %(pk)r 确实 不是 > to '%(model)s instance with %(field)s %(value)r does not exist.'如果您在自己的代码中使用此消息,请更新内插参数列表。在内部,Django将继续在params中提供pk参数,以实现向后兼容性。
  • UserCreationForm.errors_messages['duplicate_username']不再使用。If you wish to customize that error message, override it on the form using the 'unique' key in Meta.errors_messages['username'] or, if you have a custom form field for 'username', using the the 'unique' key in its error_messages argument.
  • django.contrib.adminbase.html模板中的块usertools现在需要has_permission上下文变量设置。如果您有任何使用此模板的自定义管理视图,请将其更新为AdminSite.has_permission()作为此新变量的值,或者直接在AdminSite.each_context(request)
  • ClearableFileInput小部件进行了内部更改,以允许进行更多自定义。未记录的url_markup_template属性已移除,以支持template_with_initial
  • 为了与其他主要供应商保持一致,en_GB区域设置现在将星期一作为一周的第一天。
  • 已从TIME_FORMATDATETIME_FORMATSHORT_DATETIME_FORMAT的任何区域设置中移除秒数。
  • Oracle测试表空间的默认最大大小已从300M(或200M,在1.7.2之前)增加到500M。
  • reverse()reverse_lazy()现在返回Unicode字符串而不是字节字符串。
  • CacheClass垫片已从所有缓存后端中移除。这些别名用于向后兼容Django 1.3。如果您仍在使用它们,请更新您的项目,以使用CACHES设置的BACKEND键中的真实类名。
  • 默认情况下,call_command现在总是跳过检查框架(除非你传递skip_checks=False)。
  • 在线上迭代时,File现在使用通用换行符以下被识别为结束行:Unix行尾约定'\n',Windows约定'\r\n'约定'\r'
  • 如果set()失败,Memcached缓存后端MemcachedCachePyLibMCCache这是必要的,以确保cache_db会话存储始终获取最新的会话数据。
  • Private APIs override_template_loaders and override_with_test_loader in django.test.utils were removed. 改为使用override_settings替代TEMPLATES
  • DEBUGTrue时,MySQL数据库后端的警告不再转换为异常。
  • HttpRequest现在有一个简化的repr(例如&lt; WSGIRequest: GET '/ somepath /'&gt;)。这不会更改SafeExceptionReporterFilter类的行为。
  • Class-based views that use ModelFormMixin will raise an ImproperlyConfigured exception when both the fields and form_class attributes are specified. 以前,fields被忽略。
  • 在跟踪重定向后,如果测试客户端检测到回路或达到最大重定向限制(而不是静默传递),则会提示RedirectCycleError
  • 设置为字段的default参数的可翻译字符串稍后将转换为具体字符串,因此Field.get_default()的返回类型在某些情况下不同。对可调用的结果的默认值没有更改。
  • GenericIPAddressField.empty_strings_allowed现在为False将空字符串解释为空的数据库后端(只有Django包含的后端中的Oracle)将不再将空值转换回空字符串。这与其他后端一致。
  • leave_locale_alone属性为False时,翻译现已停用,而不是强制使用“en-us”区域设置。如果您的模型包含非英语字符串,并且您计入在管理命令中激活的英语翻译,这不会再发生。它可能是迁移到1.8后生成(一次)新的数据库迁移。
  • django.utils.translation.get_language()在暂时停用翻译时,现在返回None而不是LANGUAGE_CODE
  • django.contrib.contenttypes.models.ContentTypename字段已由迁移移除,并由属性替换。这意味着您无法再通过此字段查询或过滤ContentType
  • migrate现在接受--fake-initial选项以允许伪造初始迁移。在1.7中,如果在初始迁移中创建的所有表都已存在,则始终自动伪造初始迁移。

Features deprecated in 1.8

Selected methods in django.db.models.options.Options

作为Model._meta API(从django.db.models.options.Options类)的形式化的一部分,一些方法已被弃用,在Django 2.0中删除:

  • get_all_field_names()
  • get_all_related_objects()
  • get_all_related_objects_with_model()
  • get_all_related_many_to_many_objects()
  • get_all_related_m2m_objects_with_model()
  • get_concrete_fields_with_model()
  • get_field_by_name()
  • get_fields_with_model()
  • get_m2m_with_model()

已提供migration guide来协助将您的代码从旧的API转换为新的官方API。

Loading cycle and firstof template tags from future library

Django 1.6 introduced {% load cycle from future %} and {% load firstof from future %} syntax for forward compatibility of the cycle and firstof template tags. 此语法现已弃用,将在Django 2.0中删除。You can simply remove the {% load ... from future %} tags.

django.conf.urls.patterns()

在Django的旧日,鼓励在urlpatterns中将视图引用为字符串:

urlpatterns = patterns('',
    url('^$', 'myapp.views.myview'),
)

Django会在内部神奇地导入myapp.views.myview,并将该字符串转换为真正的函数引用。为了在引用来自同一模块的许多视图时减少重复,patterns()函数需要一个所需的初始prefix参数,该参数附加到所有视图该组urlpatterns

urlpatterns = patterns('myapp.views',
    url('^$', 'myview'),
    url('^other/$', 'otherview'),
)

在现代时代,我们更新了教程,建议您直接导入视图模块并引用视图函数(或类)。这有一些优点,所有这些都源于我们使用普通Python代替“Django String Magic”:当你输入视图名称时出现的错误不那么模糊,IDE可以帮助自动完成视图名称等。

因此,这些天,上面使用prefix arg更可能被写入(并且被更好地写)为:

from myapp import views

urlpatterns = patterns('',
    url('^$', views.myview),
    url('^other/$', views.otherview),
)

因此,patterns()没有什么用处,并且是教新用户时的负担(回答新手的问题“为什么我需要这个空字符串作为patterns()由于这些原因,我们正在弃用它。更新代码非常简单,只要确保urlpatternsdjango.conf.urls.url()实例的列表即可。例如:

from django.conf.urls import url
from myapp import views

urlpatterns = [
    url('^$', views.myview),
    url('^other/$', views.otherview),
]

Passing a string as view to url()

与上一个项目相关,不推荐在url()函数中将视图引用为字符串。按照上一节所述传递可调用视图。

django.core.context_processors

内置模板上下文处理器已移至django.template.context_processors

django.test.SimpleTestCase.urls

用于在测试中指定URLconf配置的属性SimpleTestCase.urls已被弃用,将在Django 2.0中删除。请改用@override_settings(ROOT_URLCONF=...)

prefix argument to i18n_patterns()

与上一个项目相关,django.conf.urls.i18n.i18n_patterns()prefix参数已被弃用。只需传递django.conf.urls.url()实例的列表即可。

Using an incorrect count of unpacked values in the for template tag

for标记使用不正确的解压缩值计数将引发异常而不是在Django 2.0中静默失败。

Passing a dotted path to reverse() and url

通过Python路径反转URL是一个昂贵的操作,因为它导致反转路径被导入。此行为还导致了安全问题请改用named URL patterns进行反转。

If you are using django.contrib.sitemaps, add the name argument to the url that references django.contrib.sitemaps.views.sitemap():

from django.contrib.sitemaps.views import sitemap

url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
    name='django.contrib.sitemaps.views.sitemap')

以确保在通过Python路径反向时的兼容性在Django 2.0中被删除。

类似地,对于GIS Sitemap,请添加name='django.contrib.gis.sitemaps.views.kml'name='django.contrib.gis.sitemaps.views.kmz'

Aggregate methods and modules

The django.db.models.sql.aggregates and django.contrib.gis.db.models.sql.aggregates modules (both private API), have been deprecated as django.db.models.aggregates and django.contrib.gis.db.models.aggregates are now also responsible for SQL generation. 旧模块将在Django 2.0中删除。

如果您使用旧模块,请参阅Query Expressions,了解有关使用新的稳定API重写自定义聚合的说明。

django.db.models.sql.query.Query的以下方法和属性也已弃用,并且向后兼容性填充程序将在Django 2.0中删除:

  • Query.aggregates,替换为annotations
  • Query.aggregate_select,替换为annotation_select
  • Query.add_aggregate(),替换为add_annotation()
  • Query.set_aggregate_mask(),替换为set_annotation_mask()
  • Query.append_aggregate_mask(),替换为append_annotation_mask()

Extending management command arguments through Command.option_list

管理命令现在使用argparse而不是optparse来解析传递给命令的命令行参数。这也意味着添加自定义参数到命令的方式已经改变:而不是扩展option_list类列表,您现在应该覆盖add_arguments()方法, argparse.add_argument()有关详细信息,请参阅this example

django.core.management.NoArgsCommand

NoArgsCommand现已弃用,将在Django 2.0中删除。使用BaseCommand,默认情况下不使用参数。

Listing all migrations in a project

migrate管理命令的--list选项已弃用,将在Django 2.0中删除。请改用showmigrations

cache_choices option of ModelChoiceField and ModelMultipleChoiceField

ModelChoiceFieldModelMultipleChoiceField采用了未记录的未测试选项cache_choices在同一个Form对象的多个呈现之间的缓存查询。此选项受到加速淘汰,并会在Django 1.9中移除。

django.template.resolve_variable()

该函数已被非正式地标记为“已弃用”一段时间。django.template.Variable(path).resolve(context)替换resolve_variable(path, context)

django.contrib.webdesign

它提供了lorem模板标记,现在包含在内置标记中。只需从INSTALLED_APPS{% 载入 网页设计中移除'django.contrib.webdesign' %}

error_message argument to django.forms.RegexField

它为1.0之前的代码提供向后兼容性,但其功能是多余的。请改用Field.error_messages['invalid']

Old unordered_list syntax

unordered_list模板过滤器的旧版本(pre-1.0),更严格和详细的输入格式已被弃用:

``['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]``

使用新的语法,这变成:

``['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]``

django.forms.Field._has_changed()

通过删除前导下划线将此方法重命名为has_changed()旧的名称仍然会工作,直到Django 2.0。

django.utils.html.remove_tags() and removetags template filter

django.utils.html.remove_tags()以及模板过滤器removetags已被弃用,因为它们无法保证安全输出。它们的存在可能导致它们在安全敏感的上下文中使用,在那里它们实际上是不安全的。

未使用和未记录的django.utils.html.strip_entities()函数已被弃用。

is_admin_site argument to django.contrib.auth.views.password_reset()

这是一个遗留的选项,不再需要。

SubfieldBase

django.db.models.fields.subclassing.SubfieldBase已被弃用,并会在Django 2.0中移除。历史上,它用于处理从数据库加载时需要进行类型转换的字段,但不用于.values()调用或聚合中。它已替换为from_db_value()注意,新方法不像在SubfieldBase的情况那样调用to_python()方法。

django.utils.checksums

django.utils.checksums模块已弃用,将在Django 2.0中删除。它提供的功能(使用Luhn算法验证校验和)是未记录的,不在Django中使用。模块已移至django-localflavor包(版本1.1+)。

InlineAdminForm.original_content_type_id

InlineAdminForm上的original_content_type_id属性已弃用,将在Django 2.0中删除。历史上,它用于构建“在网站上查看”URL。现在可以使用表单的absolute_url属性访问此网址。

django.views.generic.edit.FormMixin.get_form()’s form_class argument

覆盖get_form()方法的FormMixin子类应确保为form_class参数提供默认值,因为它现在是可选的。

Rendering templates loaded by get_template() with a Context

在Django 1.8中,get_template()的返回类型已改变:而不是django.template.Template,它返回一个Template类型取决于哪个后端加载它。

两个类都提供了一个render()方法,但是前者需要一个django.template.Context作为参数,而后者需要dict此更改通过Django模板的弃用路径强制实施。

由于使用示例更容易理解,upgrade guide显示了如何调整受影响的代码。

所有这一切也适用于select_template()

Template and Context classes in template responses

SimpleTemplateResponseTemplateResponse的一些方法接受django.template.Contextdjango.template.Template对象作为参数。他们现在应该分别接收dict和后端相关的模板对象。

这也适用于返回类型,如果你有子类模板响应类。

有关详细信息,请参阅template response API documentation

dictionary and context_instance arguments of rendering functions

以下函数将不再接受Django 2.0中的dictionarycontext_instance参数:

  • django.shortcuts.render()
  • django.shortcuts.render_to_response()
  • django.template.loader.render_to_string()

请改用context参数。dictionary作为位置参数传递时,这是最常见的习语,不需要更改。

如果您在context_instance中传递Context,请在context参数中传递dict如果您传递RequestContext,请在request参数中单独传递请求。

dirs argument of template-finding functions

以下函数将不再接受dirs参数以覆盖Django 2.0中的TEMPLATE_DIRS

该参数不能在不同的模板加载器中一致工作,并且不适用于包含的模板。

django.template.loader.BaseLoader

django.template.loader.BaseLoader已重命名为django.template.loaders.base.Loader如果您编写了继承BaseLoader的自定义模板加载器,则必须继承Loader

django.test.utils.TestTemplateLoader

已弃用专用API django.test.utils.TestTemplateLoader以支持django.template.loaders.locmem.Loader,并将在Django 1.9中移除。

Support for the max_length argument on custom Storage classes

Storage子类应向get_available_name()和/或save()添加max_length=None重写任一方法。支持不接受此参数的存储将在Django 2.0中删除。

qn replaced by compiler

在以前的Django版本中,各种内部ORM方法(大多是as_sql方法)接受了一个qn(“quote name”)参数,用于发送到数据库。在Django 1.8中,该参数已重命名为compiler,现在是一个完整的SQLCompiler实例。为了向后兼容,调用SQLCompiler实例执行与用于qn函数相同的名称引用。However, this backwards-compatibility shim is immediately deprecated: you should rename your qn arguments to compiler, and call compiler.quote_name_unless_alias(...) where you previously called qn(...).

Default value of RedirectView.permanent

在Django 1.9中,RedirectView.permanent属性的默认值将从True更改为False

Using AuthenticationMiddleware without SessionAuthenticationMiddleware

在Django 1.7中添加了django.contrib.auth.middleware.SessionAuthenticationMiddleware在Django 1.7.2中,它的功能被移动到auth.get_user(),为了向后兼容,只有'django.contrib.auth.middleware.SessionAuthenticationMiddleware'出现在MIDDLEWARE_CLASSES中。

在Django 2.0中,无论是否启用SessionAuthenticationMiddleware(此时SessionAuthenticationMiddleware都没有意义),将启用会话验证。您可以在之前的某个时间将其添加到MIDDLEWARE_CLASSES,以便选择加入。请先阅读upgrade considerations

django.contrib.sitemaps.FlatPageSitemap

django.contrib.sitemaps.FlatPageSitemap已移至django.contrib.flatpages.sitemaps.FlatPageSitemap旧的导入位置已弃用,将在Django 1.9中删除。

ssi template tag

ssi模板标记允许文件通过绝对路径包含在模板中。This is of limited use in most deployment situations, and the include tag often makes more sense. 此标记现已弃用,将在Django 2.0中移除。

= as comparison operator in if template tag

在等号测试的模板标记中使用单个等号来标记未记录和未经测试的{% if %} 现已弃用,赞成==

%(<foo>)s syntax in ModelFormMixin.success_url

ModelFormMixin.success_url中的旧版%(<foo>)s语法已弃用,将在Django 2.0中删除。

GeoQuerySet aggregate methods

The collect(), extent(), extent3d(), makeline(), and union() aggregate methods are deprecated and should be replaced by their function-based aggregate equivalents (Collect, Extent, Extent3D, MakeLine, and Union).

Signature of the allow_migrate router method

The signature of the allow_migrate() method of database routers has changed from allow_migrate(db, model) to allow_migrate(db, app_label, model_name=None, **hints).

When model_name is set, the value that was previously given through the model positional argument may now be found inside the hints dictionary under the key 'model'.

切换到新签名后,路由器也将由RunPythonRunSQL操作调用。

Features removed in 1.8

这些功能已过期,因此已在Django 1.8中移除(有关详情,请参阅deprecation timeline):

  • django.contrib.comments已删除。
  • 将删除以下事务管理API:
    • TransactionMiddleware
    • django.db.transaction中定义的装饰器和上下文管理器autocommitcommit_on_successcommit_manually
    • 也在django.db.transaction中定义的函数commit_unless_managedrollback_unless_managed
    • TRANSACTIONS_MANAGED设置
  • cyclefirstof模板标记自动转义其参数。
  • SEND_BROKEN_LINK_EMAILS设置已删除。
  • django.middleware.doc.XViewMiddleware已删除。
  • 已删除Model._meta.module_name别名。
  • 删除引入重命名get_query_set的向后兼容垫片和类似的查询集方法。这会影响以下类:BaseModelAdminChangeListBaseCommentNodeGenericForeignKeyManagerSingleRelatedObjectDescriptorReverseSingleRelatedObjectDescriptor
  • 引入用于重命名属性ChangeList.root_query_setChangeList.query_set的向后兼容垫片被去除。
  • django.views.defaults.shortcutdjango.conf.urls.shortcut已删除。
  • 支持Python成像库(PIL)模块已删除。
  • 将删除以下私有API:
    • django.db.backend
    • django.db.close_connection()
    • django.db.backends.creation.BaseDatabaseCreation.set_autocommit()
    • django.db.transaction.is_managed()
    • django.db.transaction.managed()
  • django.forms.widgets.RadioInput已删除。
  • 模块django.test.simple和类django.test.simple.DjangoTestSuiteRunner被删除。
  • 模块django.test._doctest已删除。
  • CACHE_MIDDLEWARE_ANONYMOUS_ONLY设置已删除。此更改会影响django.middleware.cache.CacheMiddlewaredjango.middleware.cache.UpdateCacheMiddleware,尽管后面的类中缺少弃用警告。
  • 硬编码的使用在Mac上按住“Control”或“Command”可选择多个。字符串覆盖或追加到用户提供的help_text中的ManyToMany模型字段不再由Django在模型或表单层执行。
  • 将删除Model._meta.get_(add|change|delete)_permission方法。
  • 会话密钥django_language不再为向后兼容性而读取。
  • 地理Sitemap已移除(django.contrib.gis.sitemaps.views.indexdjango.contrib.gis.sitemaps.views.sitemap)。
  • django.utils.html.fix_ampersands,将删除fix_ampersands模板过滤器和django.utils.html.clean_html