Django 1.10发行说明

2016年8月1日

欢迎来到Django 1.10!

这些发行说明涵盖了从Django 1.9或更早版本升级时,您将需要注意new features以及一些backwards incompatible changes We’ve dropped some features that have reached the end of their deprecation cycle, and we’ve begun the deprecation process for some features.

如果要更新现有项目,请参阅Upgrading Django to a newer version指南。

Python兼容性

像Django 1.9,Django 1.10需要Python 2.7,3.4或3.5。 我们强烈推荐,只有正式支持每个系列的最新版本。

Django 1.10 中的新功能

全文搜索PostgreSQL

django.contrib.postgres现在包含数据库函数的collection of database functions 您可以搜索关系数据库中的多个字段,将搜索与其他查找相结合,使用不同的语言配置和权重,并按相关性对结果进行排名。

它现在还包括三角形支持,使用trigram_similar查找和TrigramSimilarityTrigramDistance表达式。

新式中间件

A new style of middleware is introduced to solve the lack of strict request/response layering of the old-style of middleware described in DEP 0005. 您需要adapt old, custom middleware,并从MIDDLEWARE_CLASSES设置切换到新的MIDDLEWARE设置,以利用改进。

官方支持Unicode用户名

django.contrib.auth中的User型号最初只接受用户名中的ASCII字母和数字。 虽然这不是一个故意的选择,Unicode字符一直被接受使用Python 3时。

用户名验证器现在默认在Python 3上明确接受Unicode字符。 This default behavior can be overridden by changing the username_validator attribute of the User model, or to any proxy of that model, using either ASCIIUsernameValidator or UnicodeUsernameValidator. 自定义用户模型也可以使用这些验证器。

次要功能

django.contrib.admin

  • For sites running on a subpath, the default URL for the "View site" link at the top of each admin page will now point to request.META['SCRIPT_NAME'] if set, instead of /.
  • 添加或编辑对象后出现的成功消息现在包含对象更改表单的链接。
  • 所有内联JavaScript被删除,以便您可以启用Content-Security-Policy HTTP标头。
  • 新的InlineModelAdmin.classes属性允许在内联字段集中指定类。 使用collapse类的内联将最初折叠,并且它们的标题将具有一个小的“show”链接。
  • 如果用户没有添加权限,则模型更改列表上的object-tools块现在将被渲染(当然没有添加按钮)。 这使得在这种情况下更容易添加自定义工具。
  • LogEntry模型现在将更改消息存储在JSON结构中,以便可以使用当前活动语言动态翻译消息。 现在,新的LogEntry.get_change_message()方法是检索更改消息的首选方法。
  • ModelAdmin.raw_id_fields中的字段的所选对象现在具有指向对象更改形式的链接。
  • 如果字段为空,则为DateFieldListFilter添加了“无日期”和“有日期”选项。
  • 嵌入在管理员中的jQuery库从版本2.1.4升级到2.2.3。

django.contrib.auth

  • 增加了对Argon2 password hash的支持。 建议使用PBKDF2,但它不是缺省的,因为它需要第三方库。
  • PBKDF2密码缓存器的默认迭代计数增加了25%。 这种向后兼容的更改不会影响具有子类django.contrib.auth.hashers.PBKDF2PasswordHasher的用户更改默认值。
  • logout()视图发送“无缓存”头,以防止Safari缓存重定向并阻止用户注销的问题。
  • login()中添加了可选的backend参数,以允许在没有凭据的情况下使用它。
  • 新的LOGOUT_REDIRECT_URL设置控制logout()视图的重定向,如果视图没有获得next_page参数。
  • login()视图的新redirect_authenticated_user参数允许重定向访问登录页面的经过身份验证的用户。
  • 新的AllowAllUsersModelBackendAllowAllUsersRemoteUserBackend忽略User.is_active的值,而ModelBackendRemoteUserBackend

django.contrib.gis

django.contrib.postgres

  • 为方便起见,HStoreField现在将其键和值转换为字符串。

django.contrib.sessions

django.contrib.staticfiles

  • The static template tag now uses django.contrib.staticfiles if it’s in INSTALLED_APPS. 这对于现在可以使用{% load static %} t4的第三方应用程序特别有用>(而不是{% load staticfiles %}来自 staticfiles / t16>),而不用担心是否安装了staticfiles应用程序。
  • You can more easily customize the collectstatic --ignore option with a custom AppConfig.

高速缓存¶ T0>

  • 基于文件的缓存后端现在使用最高的酸洗协议。

CSRF ¶ T0>

  • 默认的CSRF_FAILURE_VIEWviews.csrf.csrf_failure()现在接受一个可选的template_name参数,默认为'403_csrf.html'
  • 为了防止BREACH攻击,CSRF保护机制现在可以在每个请求上改变表单令牌值(同时保留可用于验证不同令牌的不变秘密)。

数据库后端

  • 所有后端统一了时间数据减法。
  • 如果数据库支持它,则后端可以设置DatabaseFeatures.can_return_ids_from_bulk_insert=True,并实现DatabaseOperations.fetch_returned_insert_ids()来设置使用QuerySet.bulk_create()
  • 添加了各种表达式的as_sql()方法的关键字参数(FuncWhenCaseOrderBy),以允许数据库后端自定义它们,而不会突变self,这在使用不同的数据库后端时是不安全的。 参见Func.as_sql()arg_joiner**extra_context参数。

文件存储

表格¶ T0>

  • 现在,使用django.contrib.staticfiles如果安装了表单和窗口小部件Media
  • 如果字段具有min_length,则由CharField呈现的<input>标签现在包含一个minlength属性。
  • 所需的表单字段现在具有required HTML属性。 将新的Form.use_required_attribute属性设置为False以禁用它。 窗体中不包含required属性,因为在添加和删除窗体时浏览器验证可能不正确。

通用视图

  • 现在可以从django.views导入View类。

国际¶ T0>

  • 现在可以在使用request.urlconf指定的根URLConf中使用i18n_patterns()帮助函数。
  • 通过将i18n_patterns()的新prefix_default_language参数设置为False,您可以允许访问默认语言而不使用URL前缀。
  • set_language() now returns a 204 status code (No Content) for AJAX requests when there is no next parameter in POST or GET.
  • 基于类的JavaScriptCatalogJSONCatalog视图取代了基于函数的视图的不推荐使用的javascript_catalog()json_catalog() 新视图几乎相当于旧的视图,除了默认情况下,新视图从所有安装的应用程序中收集djangojs翻译域中的所有JavaScript字符串,而不是仅从LOCALE_PATHS

管理命令

  • call_command()现在返回从command.handle()方法返回的值。
  • 新的check --fail-level选项允许指定使命令退出非零状态的消息级别。
  • 新的makemigrations --check选项会使命令退出非零状态,当检测到没有迁移的模型更改时。
  • makemigrations现在显示生成的迁移文件的路径。
  • shell --interface选项现在接受python强制使用“plain”Python解释器。
  • 新的shell --command选项可以让您运行Django命令并退出,而不是打开交互式shell。
  • 如果指定了代理模型(没有输出),而没有其具体的父级,则向dumpdata添加了警告。
  • 如果希望命令打印警告,如runserver,则新的BaseCommand.requires_migrations_checks属性可能设置为True磁盘上的迁移与数据库中的迁移不匹配。
  • 为了协助测试,call_command()现在接受一个命令对象作为第一个参数。
  • shell命令支持使用libedit的系统上的选项卡完成。 Mac系统。
  • inspectdb命令允许您通过将其名称指定为参数来选择要检查哪些表。

迁移¶ T0>

模型¶ T0>

  • 代理模型的反向外键现在被传播到具体的类。 指向代理模型的ForeignKey附加的反向关系现在可以作为代理模型类中的描述符访问,并且可以在查询过滤中引用。
  • 新的Field.rel_db_type()方法将返回指向另一个字段的字段的数据库列数据类型,例如ForeignKeyOneToOneField
  • arity类属性添加到Func 此属性可用于设置函数接受的参数数。
  • 添加了BigAutoField,它的作用非常类似于AutoField,除了它保证适合19223372036854775807之间的数字。
  • QuerySet.in_bulk() may be called without any arguments to return all objects in the queryset.
  • related_query_name现在支持使用'%(app_label)s''%(class)s'字符串的应用程序标签和类插值。
  • 允许覆盖从抽象基类继承的模型字段。
  • prefetch_related_objects()函数现在是一个公共API。
  • QuerySet.bulk_create()在使用PostgreSQL时设置对象的主键。
  • 添加了Cast数据库函数。
  • 代理模型现在可以继承多个共享一个非抽象父类的代理模型。
  • 添加Extract函数来将日期时间组件提取为整数,如年和小时。
  • 添加Trunc函数可将日期或日期时间截断为重要组件。 它们可以启用诸如每天销售量或每小时销售量的查询。
  • Model.__init__()现在从其关键字参数设置虚拟字段的值。
  • 新的Meta.base_manager_nameMeta.default_manager_name选项允许分别控制_base_manager_default_manager

请求和回复

序列化¶ T0>

  • django.core.serializers.json.DjangoJSONEncoder现在知道如何序列化通常用于可翻译内容的延迟字符串。

模板¶ T0>

  • autoescape选项添加到DjangoTemplates后端和Engine类。
  • Added the is and is not comparison operators to the if tag.
  • 允许dictsort按指定索引的元素排列列表。
  • debug()上下文处理器包含对所有数据库别名的查询,而不是仅默认别名。
  • 添加了对extendsinclude模板标签的字符串参数的相对路径支持。

测试¶ T0>

网址¶ T0>

  • django.setup()中的一个添加允许在请求/响应周期之外发生的URL解析(例如,在管理命令和独立脚本中),以便在FORCE_SCRIPT_NAME中考虑被设置。

验证¶ T0>

  • URLValidator现在将域名标签的长度限制为63个字符,并将域名的总长度限制为每个 RFC 1034的253个字符。
  • int_list_validator()现在接受一个可选的allow_negative布尔参数,默认为False,以允许负整数。

向下不兼容的更改1.10

警告

除了本节中介绍的更改外,请务必查看在1.10中删除的Features removed in 1.10 如果您没有在特定功能的弃用时间轴内更新代码,则其删除可能会显示为向后不兼容的更改。

数据库后端API

  • GIS的AreaField使用未指定的底层数字类型,实际上可以是任何数字Python类型。 现在将从数据库检索的decimal.Decimal值转换为float,以便将它们与GIS库使用的值进行组合。
  • 为了启用时间减法,您必须将supports_temporal_subtraction数据库功能标志设置为True,并实现DatabaseOperations.subtract_temporals()方法。 该方法应返回用于计算用于存储DurationField的数据类型中的lhsrhs参数之间的差异所需的SQL和参数。

_meta.get_fields()为代理模型返回一致的反向字段

在Django 1.10之前,与代理的具体类相比,在代理模型上调用时,get_fields()方法返回不同的反向字段。 这种不一致性是通过在两种情况下返回指向一个具体类或其代理的全部字段来修复的。

AbstractUser.username max_length增加到150

包含django.contrib.auth.models.User.username的迁移。 如果您具有继承自AbstractUser的自定义用户模型,则需要为用户模型生成并应用数据库迁移。

我们认为增加到254个字符,以更容易地使用电子邮件地址(限制为254个字符)作为用户名,但由于MySQL的限制而被拒绝。 当使用utf8mb4编码(推荐用于正确的Unicode支持)时,MySQL只能在默认情况下创建191个字符的唯一索引。 因此,如果您需要较长的长度,请使用自定义用户模型。

如果要保留用户名的30个字符限制,请在创建用户或更改用户名时使用自定义表单:

from django.contrib.auth.forms import UserCreationForm

class MyUserCreationForm(UserCreationForm):
    username = forms.CharField(
        max_length=30,
        help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.',
    )

如果您希望在管理员中保留此限制,请将UserAdmin.add_form设置为使用此窗体:

from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

class UserAdmin(BaseUserAdmin):
    add_form = MyUserCreationForm

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

支持PostgreSQL 9.1

PostgreSQL 9.1的上游支持在2016年9月结束。 因此,Django 1.10将PostgreSQL 9.2设置为它正式支持的最低版本。

runserver输出通过日志记录

runserver命令的请求和响应处理被发送到django.server记录器,而不是sys.stderr 如果您禁用Django的日志记录配置或用自己的日志配置来重写,那么如果要查看该输出,则需要添加适当的日志记录配置:

'formatters': {
    'django.server': {
        '()': 'django.utils.log.ServerFormatter',
        'format': '[%(server_time)s] %(message)s',
    }
},
'handlers': {
    'django.server': {
        'level': 'INFO',
        'class': 'logging.StreamHandler',
        'formatter': 'django.server',
    },
},
'loggers': {
    'django.server': {
        'handlers': ['django.server'],
        'level': 'INFO',
        'propagate': False,
    }
}

auth.CustomUserauth.ExtensionUser测试模型被删除

自从在Django 1.8中为contrib应用程序引入迁移之后,这些自定义用户测试模型的表格不再被创建,使得它们在测试环境中不可用。

Apps registry is no longer auto-populated when unpickling models outside of Django

解除模型时,应用注册表不再自动填充。 这被添加到Django 1.7.2中,试图允许在Django之外的诸如RQ工作者之外的unpickling模型,而不调用django.setup(),但它会造成死锁的可能性。 要适应您的代码,在RQ的情况下,您可以提供您自己的工作脚本调用django.setup()

删除非空外键字段的空分配检查

在旧版本中,将None分配给不可为空的ForeignKeyOneToOneField ValueError异常('不能 分配 没有: “model.field” 允许 空值 值。“). 为了与没有类似检查的其他模型字段保持一致,此检查将被删除。

从默认的PASSWORD_HASHERS设置中删除弱密码

Django 0.90将密码存储为未加密的MD5。 Django 0.91增加了对盐酸SHA1的支持,当用户登录时自动升级密码。 Django 1.4添加了PBKDF2作为默认密码哈希。

如果您有一个旧的Django项目与MD5或SHA1(甚至盐)编码的密码,请注意,这些可以很容易地破解与今天的硬件。 为了使Django用户继续使用弱哈希值,以下的哈希值将从默认的PASSWORD_HASHERS设置中删除:

'django.contrib.auth.hashers.SHA1PasswordHasher'
'django.contrib.auth.hashers.MD5PasswordHasher'
'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher'
'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher'
'django.contrib.auth.hashers.CryptPasswordHasher'

考虑使用wrapped password hasher来加强数据库中的哈希值。 如果不可行,请将PASSWORD_HASHERS设置添加到您的项目中,并添加所需的任何哈希值。

您可以检查数据库是否有任何已删除的哈希尔属性:

from django.contrib.auth import get_user_model
User = get_user_model()

# Unsalted MD5/SHA1:
User.objects.filter(password__startswith='md5$$')
User.objects.filter(password__startswith='sha1$$')
# Salted MD5/SHA1:
User.objects.filter(password__startswith='md5$').exclude(password__startswith='md5$$')
User.objects.filter(password__startswith='sha1$').exclude(password__startswith='sha1$$')
# Crypt hasher:
User.objects.filter(password__startswith='crypt$$')

from django.db.models import CharField
from django.db.models.functions import Length
CharField.register_lookup(Length)
# Unsalted MD5 passwords might not have an 'md5$$' prefix:
User.objects.filter(password__length=32)

Field.get_prep_lookup()Field.get_db_prep_lookup()方法被删除

如果您有一个自定义字段来实现这些方法之一,请为其注册自定义查找。 像这样:

from django.db.models import Field
from django.db.models.lookups import Exact

class MyField(Field):
    ...

class MyFieldExact(Exact):
    def get_prep_lookup(self):
        # do_custom_stuff_for_myfield
        ....

MyField.register_lookup(MyFieldExact)

django.contrib.gis

  • 支持SpatiaLite
  • The add_postgis_srs() backwards compatibility alias for django.contrib.gis.utils.add_srs_entry() is removed.
  • 在Oracle / GIS上,Area聚合函数现在返回一个float,而不是decimal.Decimal (它仍然以一平方米的尺寸包装。)
  • 缺省情况下,修改默认的GEOSGeometry表示(WKT输出)。 也就是说,代替POINT (23.0000000000000000 5.5000000000000000),你会得到POINT (23 5.5)

请求正文的最大大小和GET / POST参数的数量受限于

两个新设置有助于通过大量请求来减轻拒绝服务攻击:

接收异常大表单的应用程序可能需要调整这些设置。

其它¶ T0>

  • QuerySetrepr()包裹在&lt; QuerySet &gt;在调试时将其从普通列表中消除歧义。
  • utils.version.get_version() returns PEP 440 compliant release candidate versions (e.g. ‘1.10rc1’ instead of ‘1.10c1’).
  • CSRF令牌值现在需要为64个字母数字的字符串;默认情况下,由旧版本的Django设置的32个字母数字的值将自动替换为64个字符的字符串。 其他值被视为无效。 这只会影响替换这些令牌的开发人员或用户。
  • 由于Django自1.0之前就没有使用,因此删除了LOGOUT_URL设置。 如果您在项目中使用它,您可以将其添加到项目的设置中。 默认值为'/accounts/logout/'
  • 传递给HttpResponseclose()方法的对象现在立即关闭,而不是当WSGI服务器调用close()对响应。
  • 删除QuerySet.update_or_create()中的冗余transaction.atomic()调用。 这可能会影响由TransactionTestCase.assertNumQueries()测试的查询计数。
  • BaseCommand.execute(**options)中支持skip_validation被删除。 使用skip_checks(添加在Django 1.7中)。
  • loaddata现在引发一个CommandError,而不是在找不到指定的fixture文件时显示警告。
  • 而不是直接访问LogEntry.change_message属性,现在最好调用将使用当前语言提供消息的LogEntry.get_change_message()方法。
  • 如果指定了不存在的template_name,则默认错误视图会引发TemplateDoesNotExist
  • SelectSelectMultiple小部件render()方法的未使用的choices关键字参数被删除。 render_options()方法的choices参数也被删除,使第一个参数selected_choices
  • 如果在支持可延展约束的数据库上运行,那么违反可延迟数据库约束的测试现在将会出错。
  • 内置管理命令现在使用options中的键索引,例如options['verbosity'],而不是options.get(),不再执行任何类型的强制。 如果您使用Command.execute()(其绕过设置默认值的参数解析器)而不是call_command()来调用命令,则可能会出现此问题。 将命令对象作为第一个参数传递给call_command()而不是调用Command.execute()
  • ModelBackendRemoteUserBackend现在拒绝不活动的用户。 这意味着,如果从is_active=True切换到False,则无效用户无法登录,并且将被注销。 如果您需要以前的行为,请改用AUTHENTICATION_BACKENDS中的新的AllowAllUsersModelBackendAllowAllUsersRemoteUserBackend
  • 鉴于以前的更改,测试客户端的login()方法不再总是拒绝非活动用户,而是将此决定委托给身份验证后端。 force_login()还将决定委托给身份验证后端,因此如果您使用默认后端,则需要使用活动用户。
  • django.views.i18n.set_language()现在可以返回AJAX请求的204状态代码。
  • RangeFieldbase_field属性现在是一种字段,而不是字段的实例。 如果您创建了RangeField的自定义子类,则应更改base_field属性。
  • 中间件类现在在服务器启动而不是在第一个请求期间被初始化。
  • 如果在自定义用户模型中覆盖is_authenticated()is_anonymous(),则必须将它们转换为属性或属性,如the deprecation note
  • 当使用ModelAdmin.save_as=True时,“另存为”按钮现在将重定向到新对象的更改视图,而不是模型的更改列表。 如果您需要先前的行为,请将新的ModelAdmin.save_as_continue属性设置为False
  • 所需的表单字段现在具有required HTML属性。 Form.use_required_attribute属性设置为False以禁用它。 如果您不想浏览器验证,也可以将novalidate属性添加到<form> 要禁用自定义小部件上的required属性,请覆盖Widget.use_required_attribute()方法。
  • WSGI处理程序不再删除HEAD请求或响应的响应内容,其中status_code为100-199,204或304。 大多数Web服务器已经实现了这种行为 使用Django测试客户端检索的响应继续使用这些“响应修复”。
  • Model.__init__()现在接收django.db.models.DEFERRED作为延迟字段的值。
  • 当使用QuerySet.defer()only()被删除时,Model._deferred属性将被删除为动态模型类。
  • Storage.save()不再将'\'替换为'/' 这个行为被移动到FileSystemStorage,因为这是一个特定于存储的实现细节。 任何依赖于此行为的自定义存储实现的Windows用户都需要在自定义存储的save()方法中实现。
  • 私人FileField方法get_directory_name()get_filename()不再被调用(现在已被弃用),这是用户覆盖的向后不兼容的更改那些习惯字段的方法。 为了调整这样的代码,代替覆盖FileField.generate_filename()Storage.generate_filename() 也可以使用upload_to
  • AdminEmailHandler发送的邮件主题不再被截断为989个字符。 如果您的长度有限,请自行截断主题。
  • 私有表达式django.db.models.expressions.DateDateTime被删除。 新的Trunc表达式提供相同的功能。
  • 从模型实例中删除_base_manager_default_manager属性。 他们仍然可以在模型类上访问。
  • 访问模型实例上的已删除字段,例如。在del obj.field之后,重新加载字段的值,而不是提高AttributeError
  • 如果你继承AbstractBaseUser并覆盖clean(),请确保它调用了super() AbstractBaseUser.normalize_username()在一个新的AbstractBaseUser.clean()方法中调用。
  • private API django.forms.models.model_to_dict()返回一个查询集,而不是ManyToManyField的主键列表。
  • If django.contrib.staticfiles is installed, the static template tag uses the staticfiles storage to construct the URL rather than simply joining the value with STATIC_ROOT. 新方法对URL进行编码,这在URL中包括片段,例如, {% static 'img.svg#fragment' %} #编码为%23 为了适应,将片段移出模板标签之外:{% static 'img.svg' %}#fragment T4> T0>。
  • USE_L10NTrue时,当未指定格式字符串时,现在将应用datetime过滤器的本地化。 使用来自活动语言环境的DATE_FORMATTIME_FORMAT说明符而不是相同名称的设置。

功能已在1.10 中弃用

直接分配到反向外键或多对多关系

而不是使用直接分配来分配相关对象:

>>> new_list = [obj1, obj2, obj3]
>>> e.related_set = new_list

使用在Django 1.9中添加的set()方法:

>>> e.related_set.set([obj1, obj2, obj3])

这可以避免对赋值产生隐含保存的混淆。

非时区感知Storage API

The old, non-timezone-aware methods accessed_time(), created_time(), and modified_time() are deprecated in favor of the new get_*_time() methods.

第三方存储后端应实现新方法,并将旧方法标记为已弃用。 在此之前,基于Storage类的新的get_*_time()方法根据需要从旧方法转换datetime,并发出弃用警告他们这样做。

只要希望支持早期版本的Django,第三方存储后端可能会保留旧的方法。

django.contrib.gis

  • The get_srid() and set_srid() methods of GEOSGeometry are deprecated in favor of the srid property.
  • get_x()set_x()get_y()set_y()get_z()set_z()方法Point不利于xy ,和z属性。
  • Pointget_coords()set_coords()方法已被弃用,有利于tuple属性。
  • MultiPolygoncascaded_union属性不利于unary_union属性。
  • django.contrib.gis.utils.precision_wkt()函数不利于WKTWriter

CommaSeparatedIntegerField model field

CommaSeparatedIntegerField is deprecated in favor of CharField with the validate_comma_separated_integer_list() validator:

from django.core.validators import validate_comma_separated_integer_list
from django.db import models

class MyModel(models.Model):
    numbers = models.CharField(..., validators=[validate_comma_separated_integer_list])

如果您使用Oracle,CharField使用与CommaSeparatedIntegerFieldVARCHAR2)不同的数据库字段类型(NVARCHAR2), 。 根据您的数据库设置,这可能意味着不同的编码,因此相同内容的长度(以字节为单位)不同。 如果您的存储值超过了NVARCHAR2的4000字节限制,则应改用TextFieldNCLOB)。 在这种情况下,如果您有任何按该字段进行分组的查询(例如使用聚合注释模型或使用distinct()),则需要更改它们(以推迟字段)。

__search查询查询

不支持仅支持MySQL且功能极其有限的search查找。 用自定义查找替换它:

from django.db import models

class Search(models.Lookup):
    lookup_name = 'search'

    def as_mysql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return 'MATCH (%s) AGAINST (%s IN BOOLEAN MODE)' % (lhs, rhs), params

models.CharField.register_lookup(Search)
models.TextField.register_lookup(Search)

使用User.is_authenticated()User.is_anonymous()作为方法

现在属性是AbstractBaseUserAnonymousUser类的is_authenticated()is_anonymous()方法。 它们仍然可以作为Django 2.0的方法,但Django中的所有用法现在都使用属性访问。

例如,如果您使用AuthenticationMiddleware,并想知道用户当前是否登录,您将使用:

if request.user.is_authenticated:
    ... # Do something for logged-in users.
else:
    ... # Do something for anonymous users.

而不是request.user.is_authenticated()

如果您忘记调用方法,则此更改可避免意外的信息泄漏,例如:

if request.user.is_authenticated:
    return sensitive_information

如果您在自定义用户模型中覆盖这些方法,则必须将其更改为属性或属性。

Django使用CallableBool对象来允许这些属性作为属性和方法一起工作。 因此,直到弃用期结束,您无法使用is运算符来比较这些属性。 也就是说,以下将不起作用:

if request.user.is_authenticated is True:
    ...

django.utils.safestring

The mark_for_escaping() function and the classes it uses: EscapeData, EscapeBytes, EscapeText, EscapeString, and EscapeUnicode are deprecated.

因此,不考虑使用escape过滤器(它将始终作为最后一个过滤器应用的“懒惰”行为,无论其出现在过滤器链中的哪个位置)。 过滤器将更改为立即在Django 2.0中应用conditional_escape()

其它¶ T0>

  • makemigrations - 退出选项不利于makemigrations --check选项。
  • django.utils.functional.allow_lazy()不利于新的keep_lazy()函数,可以使用更自然的装饰器语法。
  • The shell --plain option is deprecated in favor of -i python or --interface python.
  • django.core.urlresolvers模块导入不利于其新位置django.urls
  • 模板Context.has_key()方法已被弃用,有利于中的in
  • Model._meta的私有属性virtual_fields不利于private_fields
  • Model._meta.add_field()中的Field.contribute_to_class()virtual中的私有关键字参数virtual_only分别赞成private_onlyprivate
  • javascript_catalog()json_catalog()视图不利于基于类的视图JavaScriptCatalogJSONCatalog
  • 在多表继承中,不推荐将OneToOneField隐式升级到parent_link parent_link=True添加到这些字段。
  • 私有API Widget._format_value()被公开,并重命名为format_value() 旧名称将通过弃用期工作。
  • private FileField方法get_directory_name()get_filename()不利于在Storage.generate_filename()
  • 使用settings.MIDDLEWARE_CLASSES的旧式中间件已弃用。 Adapt old, custom middleware,并使用新的MIDDLEWARE设置。

在1.10 中删除的功能

这些功能已经到了它们的淘汰周期的终点,并在Django 1.10中被删除。 有关详细信息,请参见Features deprecated in 1.8的功能,包括如何删除这些功能的使用。

  • Support for calling a SQLCompiler directly as an alias for calling its quote_name_unless_alias method is removed.
  • cyclefirstof模板标记从future模板标记库中删除。
  • django.conf.urls.patterns()被删除。
  • django.conf.urls.i18n.i18n_patterns()prefix参数的支持将被删除。
  • SimpleTestCase.urls被删除。
  • for模板标签中使用不正确的解压缩数量计数引发异常,而不是默默地失败。
  • 使用虚线Python路径的reverse() URL的功能被删除。
  • LOGIN_URLLOGIN_REDIRECT_URL设置使用虚线Python路径的功能将被删除。
  • 针对自定义管理命令删除对optparse的支持。
  • django.core.management.NoArgsCommand被删除。
  • django.core.context_processors模块被删除。
  • django.db.models.sql.aggregates模块被删除。
  • django.contrib.gis.db.models.sql.aggregates模块被删除。
  • django.db.sql.query.Query的以下方法和属性将被删除:
    • 属性:aggregatesaggregate_select
    • 方法:add_aggregateset_aggregate_maskappend_aggregate_mask
  • django.template.resolve_variable被删除。
  • 以下私有API将从django.db.models.options.OptionsModel._meta)中删除:
    • get_field_by_name()
    • get_all_field_names()
    • get_fields_with_model()
    • get_concrete_fields_with_model()
    • get_m2m_with_model()
    • get_all_related_objects()
    • get_all_related_objects_with_model()
    • get_all_related_many_to_many_objects()
    • get_all_related_m2m_objects_with_model()
  • django.forms.RegexFielderror_message参数被删除。
  • unordered_list过滤器不再支持旧样式列表。
  • 支持view url()的参数被删除。
  • django.forms.Form._has_changed()重新命名为has_changed()的向后兼容垫片将被删除。
  • 删除removetags模板过滤器。
  • django.utils.html中的remove_tags()strip_entities()功能被删除。
  • django.contrib.auth.views.password_reset()is_admin_site参数被删除。
  • django.db.models.field.subclassing.SubfieldBase被删除。
  • django.utils.checksums已删除。
  • 删除了django.contrib.admin.helpers.InlineAdminForm上的original_content_type_id属性。
  • 允许FormMixin.get_form()被定义为没有其form_class参数的默认值的向后兼容性垫片被删除。
  • 删除以下设置,you must upgrade升级到TEMPLATES设置:
    • ALLOWED_INCLUDE_ROOTS
    • TEMPLATE_CONTEXT_PROCESSORS
    • TEMPLATE_DEBUG
    • TEMPLATE_DIRS
    • TEMPLATE_LOADERS
    • TEMPLATE_STRING_IF_INVALID
  • 向后兼容性别名django.template.loader.BaseLoader被删除。
  • get_template()select_template()返回的Django模板对象不再接受其render()中的Context方法。
  • Template response APIs分别强制使用dict和后端相关的模板对象,而不是分别使用ContextTemplate
  • 以下函数和类的current_app参数被删除:
    • django.shortcuts.render()
    • 一个django.template.Context()
    • django.template.RequestContext()
    • django.template.response.TemplateResponse()
  • 删除以下功能的dictionarycontext_instance参数:
    • django.shortcuts.render()
    • django.shortcuts.render_to_response()
    • django.template.loader.render_to_string()
  • 删除以下功能的dirs参数:
    • django.template.loader.get_template()
    • django.template.loader.select_template()
    • django.shortcuts.render()
    • django.shortcuts.render_to_response()
  • Session verification is enabled regardless of whether or not 'django.contrib.auth.middleware.SessionAuthenticationMiddleware' is in MIDDLEWARE_CLASSES. SessionAuthenticationMiddleware不再有任何用途,可以从MIDDLEWARE_CLASSES中删除。 它保存为一个存根,直到Django 2.0为不阅读本笔记的用户的礼貌。
  • 私有属性django.db.models.Field.related被删除。
  • 删除migrate管理命令的--list选项。
  • 删除了ssi模板标签。
  • 删除if模板标签中=比较运算符的支持。
  • 向后兼容性垫片允许定义没有max_length参数的Storage.get_available_name()Storage.save()
  • ModelFormMixin.success_url中的旧版%(<foo>)s语法的支持将被删除。
  • GeoQuerySet aggregate methods collect(), extent(), extent3d(), make_line(), and unionagg() are removed.
  • 在创建内容类型实例时指定ContentType.name的功能被删除。
  • 支持allow_migrate的旧签名已被删除。
  • 支持使用逗号分隔参数的{% 循环 % t>>的语法。
  • 当赋予无效分隔符时发出Signer的警告现在是ValueError