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指南。
像Django 1.9,Django 1.10需要Python 2.7,3.4或3.5。 我们强烈推荐,只有正式支持每个系列的最新版本。
django.contrib.postgres
现在包含数据库函数的collection of database
functions 您可以搜索关系数据库中的多个字段,将搜索与其他查找相结合,使用不同的语言配置和权重,并按相关性对结果进行排名。
它现在还包括三角形支持,使用trigram_similar
查找和TrigramSimilarity
和TrigramDistance
表达式。
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
设置,以利用改进。
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
¶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 /
.Content-Security-Policy
HTTP标头。InlineModelAdmin.classes
属性允许在内联字段集中指定类。 使用collapse
类的内联将最初折叠,并且它们的标题将具有一个小的“show”链接。object-tools
块现在将被渲染(当然没有添加按钮)。
这使得在这种情况下更容易添加自定义工具。LogEntry
模型现在将更改消息存储在JSON结构中,以便可以使用当前活动语言动态翻译消息。 现在,新的LogEntry.get_change_message()
方法是检索更改消息的首选方法。ModelAdmin.raw_id_fields
中的字段的所选对象现在具有指向对象更改形式的链接。DateFieldListFilter
添加了“无日期”和“有日期”选项。django.contrib.auth
¶django.contrib.auth.hashers.PBKDF2PasswordHasher
的用户更改默认值。logout()
视图发送“无缓存”头,以防止Safari缓存重定向并阻止用户注销的问题。login()
中添加了可选的backend
参数,以允许在没有凭据的情况下使用它。LOGOUT_REDIRECT_URL
设置控制logout()
视图的重定向,如果视图没有获得next_page
参数。login()
视图的新redirect_authenticated_user
参数允许重定向访问登录页面的经过身份验证的用户。AllowAllUsersModelBackend
和AllowAllUsersRemoteUserBackend
忽略User.is_active
的值,而ModelBackend
和RemoteUserBackend
django.contrib.gis
¶GEOSGeometry.unary_union
属性计算此几何元素的所有元素的并集。GEOSGeometry.covers()
二进制谓词。GDALBand.statistics()
方法和mean
和std
属性。MakeLine
聚合和GeoHash
功能的支持。Difference
,Intersection
和SymDifference
函数的支持。WKTWriter
的新trim
和precision
属性允许控制WKT中坐标的小数部分的输出。LineString.closed
和MultiLineString.closed
属性。properties
字典中的对象的主键。GDALBand.data()
方法上复制输入数据的能力。 现在可以有效地重复使用频带数据。IsValid
和MakeValid
,以及isvalid
查找,全部用于PostGIS。 这允许在数据库端过滤和修复无效几何。django.contrib.postgres
¶HStoreField
现在将其键和值转换为字符串。django.contrib.sessions
¶clearsessions
管理命令现在删除基于文件的会话。django.contrib.staticfiles
¶static
template tag now uses django.contrib.staticfiles
if it’s in INSTALLED_APPS
. 这对于现在可以使用{% load static %} t4的第三方应用程序特别有用>
(而不是{% load staticfiles %}
来自 staticfiles / t16>),而不用担心是否安装了staticfiles
应用程序。collectstatic --ignore
option with a custom AppConfig
.CSRF_FAILURE_VIEW
,views.csrf.csrf_failure()
现在接受一个可选的template_name
参数,默认为'403_csrf.html'
DatabaseFeatures.can_return_ids_from_bulk_insert=True
,并实现DatabaseOperations.fetch_returned_insert_ids()
来设置使用QuerySet.bulk_create()
as_sql()
方法的关键字参数(Func
,When
,Case
和OrderBy
),以允许数据库后端自定义它们,而不会突变self
,这在使用不同的数据库后端时是不安全的。 参见Func.as_sql()
的arg_joiner
和**extra_context
参数。get_accessed_time()
,get_created_time()
和get_modified_time()
提供时区感知API。 如果USE_TZ
是True
,并且本地时区的天真datetime
则返回时区感知datetime
。Storage.generate_filename()
方法可以轻松实现以前在FileField
中不使用os.path
调用的自定义存储。django.contrib.staticfiles
如果安装了表单和窗口小部件Media
。min_length
,则由CharField
呈现的<input>
标签现在包含一个minlength
属性。required
HTML属性。 将新的Form.use_required_attribute
属性设置为False
以禁用它。 窗体中不包含required
属性,因为在添加和删除窗体时浏览器验证可能不正确。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
.JavaScriptCatalog
和JSONCatalog
视图取代了基于函数的视图的不推荐使用的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
命令允许您通过将其名称指定为参数来选择要检查哪些表。enum.Enum
对象的序列化的支持。elidable
参数添加到RunSQL
和RunPython
操作中,以便在压缩迁移时将其删除。Migration
上设置atomic
属性,增加了对non-atomic migrations。migrate
和makemigrations
命令现在check for a
consistent migration history。 如果他们发现应用迁移的一些未应用的依赖项,则会引发InconsistentMigrationHistory
。pre_migrate()
和post_migrate()
信号现在发送他们的迁移plan
和apps
。ForeignKey
附加的反向关系现在可以作为代理模型类中的描述符访问,并且可以在查询过滤中引用。Field.rel_db_type()
方法将返回指向另一个字段的字段的数据库列数据类型,例如ForeignKey
和OneToOneField
。arity
类属性添加到Func
。 此属性可用于设置函数接受的参数数。BigAutoField
,它的作用非常类似于AutoField
,除了它保证适合1
到9223372036854775807
之间的数字。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_name
和Meta.default_manager_name
选项允许分别控制_base_manager
和_default_manager
。request.user
添加到调试视图。HttpResponse
方法readable()
和seekable()
使一个实例成为一个流状对象,并允许用io.TextIOWrapper
CONTENT_TYPE
头解析的HttpRequest.content_type
和content_params
属性。request.COOKIES
的解析器被简化以更好地匹配浏览器的行为。 request.COOKIES
现在可能包含根据 RFC 6265无效的Cookie,但可以通过document.cookie
django.core.serializers.json.DjangoJSONEncoder
现在知道如何序列化通常用于可翻译内容的延迟字符串。TestCase
现在在每个测试结束时检查可延迟的数据库约束。test --tag
and test
--exclude-tag
options.django.contrib.sessions
is not in INSTALLED_APPS
.django.setup()
中的一个添加允许在请求/响应周期之外发生的URL解析(例如,在管理命令和独立脚本中),以便在FORCE_SCRIPT_NAME
中考虑被设置。URLValidator
现在将域名标签的长度限制为63个字符,并将域名的总长度限制为每个 RFC 1034的253个字符。int_list_validator()
现在接受一个可选的allow_negative
布尔参数,默认为False
,以允许负整数。警告
除了本节中介绍的更改外,请务必查看在1.10中删除的Features removed in 1.10 如果您没有在特定功能的弃用时间轴内更新代码,则其删除可能会显示为向后不兼容的更改。
AreaField
使用未指定的底层数字类型,实际上可以是任何数字Python类型。 现在将从数据库检索的decimal.Decimal
值转换为float
,以便将它们与GIS库使用的值进行组合。supports_temporal_subtraction
数据库功能标志设置为True
,并实现DatabaseOperations.subtract_temporals()
方法。 该方法应返回用于计算用于存储DurationField
的数据类型中的lhs
和rhs
参数之间的差异所需的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的上游支持在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.CustomUser
和auth.ExtensionUser
测试模型被删除¶自从在Django 1.8中为contrib应用程序引入迁移之后,这些自定义用户测试模型的表格不再被创建,使得它们在测试环境中不可用。
解除模型时,应用注册表不再自动填充。 这被添加到Django 1.7.2中,试图允许在Django之外的诸如RQ工作者之外的unpickling模型,而不调用django.setup()
,但它会造成死锁的可能性。 要适应您的代码,在RQ的情况下,您可以提供您自己的工作脚本调用django.setup()
。
在旧版本中,将None
分配给不可为空的ForeignKey
或OneToOneField
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
¶add_postgis_srs()
backwards compatibility alias for
django.contrib.gis.utils.add_srs_entry()
is removed.Area
聚合函数现在返回一个float
,而不是decimal.Decimal
。
(它仍然以一平方米的尺寸包装。)GEOSGeometry
表示(WKT输出)。 也就是说,代替POINT (23.0000000000000000 5.5000000000000000)
,你会得到POINT (23 5.5)
。两个新设置有助于通过大量请求来减轻拒绝服务攻击:
DATA_UPLOAD_MAX_MEMORY_SIZE
限制请求主体可能的大小。 文件上传不会计入此限制。DATA_UPLOAD_MAX_NUMBER_FIELDS
限制已解析的GET / POST参数数。接收异常大表单的应用程序可能需要调整这些设置。
QuerySet
的repr()
包裹在&lt; QuerySet &gt;
在调试时将其从普通列表中消除歧义。utils.version.get_version()
returns PEP 440 compliant release
candidate versions (e.g. ‘1.10rc1’ instead of ‘1.10c1’).LOGOUT_URL
设置。 如果您在项目中使用它,您可以将其添加到项目的设置中。 默认值为'/accounts/logout/'
。HttpResponse
的close()
方法的对象现在立即关闭,而不是当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
。Select
和SelectMultiple
小部件render()
方法的未使用的choices
关键字参数被删除。 render_options()
方法的choices
参数也被删除,使第一个参数selected_choices
。options
中的键索引,例如options['verbosity']
,而不是options.get()
,不再执行任何类型的强制。 如果您使用Command.execute()
(其绕过设置默认值的参数解析器)而不是call_command()
来调用命令,则可能会出现此问题。 将命令对象作为第一个参数传递给call_command()
而不是调用Command.execute()
。ModelBackend
和RemoteUserBackend
现在拒绝不活动的用户。 这意味着,如果从is_active=True
切换到False
,则无效用户无法登录,并且将被注销。 如果您需要以前的行为,请改用AUTHENTICATION_BACKENDS
中的新的AllowAllUsersModelBackend
或AllowAllUsersRemoteUserBackend
。login()
方法不再总是拒绝非活动用户,而是将此决定委托给身份验证后端。
force_login()
还将决定委托给身份验证后端,因此如果您使用默认后端,则需要使用活动用户。django.views.i18n.set_language()
现在可以返回AJAX请求的204状态代码。RangeField
的base_field
属性现在是一种字段,而不是字段的实例。 如果您创建了RangeField
的自定义子类,则应更改base_field
属性。is_authenticated()
或is_anonymous()
,则必须将它们转换为属性或属性,如the deprecation noteModelAdmin.save_as=True
时,“另存为”按钮现在将重定向到新对象的更改视图,而不是模型的更改列表。 如果您需要先前的行为,请将新的ModelAdmin.save_as_continue
属性设置为False
。required
HTML属性。 将Form.use_required_attribute
属性设置为False
以禁用它。 如果您不想浏览器验证,也可以将novalidate
属性添加到<form>
。 要禁用自定义小部件上的required
属性,请覆盖Widget.use_required_attribute()
方法。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.Date
和DateTime
被删除。 新的Trunc
表达式提供相同的功能。_base_manager
和_default_manager
属性。 他们仍然可以在模型类上访问。del obj.field
之后,重新加载字段的值,而不是提高AttributeError
。AbstractBaseUser
并覆盖clean()
,请确保它调用了super()
。 AbstractBaseUser.normalize_username()
在一个新的AbstractBaseUser.clean()
方法中调用。django.forms.models.model_to_dict()
返回一个查询集,而不是ManyToManyField
的主键列表。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_L10N
是True
时,当未指定格式字符串时,现在将应用date
和time
过滤器的本地化。 使用来自活动语言环境的DATE_FORMAT
和TIME_FORMAT
说明符而不是相同名称的设置。而不是使用直接分配来分配相关对象:
>>> 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
¶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
不利于x
,y
,和z
属性。Point
的get_coords()
和set_coords()
方法已被弃用,有利于tuple
属性。MultiPolygon
的cascaded_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
使用与CommaSeparatedIntegerField
(VARCHAR2
)不同的数据库字段类型(NVARCHAR2
), 。 根据您的数据库设置,这可能意味着不同的编码,因此相同内容的长度(以字节为单位)不同。 如果您的存储值超过了NVARCHAR2
的4000字节限制,则应改用TextField
(NCLOB
)。 在这种情况下,如果您有任何按该字段进行分组的查询(例如使用聚合注释模型或使用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()
作为方法¶现在属性是AbstractBaseUser
和AnonymousUser
类的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()
。
makemigrations - 退出
选项不利于makemigrations --check
选项。django.utils.functional.allow_lazy()
不利于新的keep_lazy()
函数,可以使用更自然的装饰器语法。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_only
和private
。javascript_catalog()
和json_catalog()
视图不利于基于类的视图JavaScriptCatalog
和JSONCatalog
。OneToOneField
隐式升级到parent_link
。 将parent_link=True
添加到这些字段。Widget._format_value()
被公开,并重命名为format_value()
。 旧名称将通过弃用期工作。FileField
方法get_directory_name()
和get_filename()
不利于在Storage.generate_filename()
settings.MIDDLEWARE_CLASSES
的旧式中间件已弃用。 Adapt old, custom middleware,并使用新的MIDDLEWARE
设置。这些功能已经到了它们的淘汰周期的终点,并在Django 1.10中被删除。 有关详细信息,请参见Features deprecated in 1.8的功能,包括如何删除这些功能的使用。
SQLCompiler
directly as an alias for calling its
quote_name_unless_alias
method is removed.cycle
和firstof
模板标记从future
模板标记库中删除。django.conf.urls.patterns()
被删除。django.conf.urls.i18n.i18n_patterns()
的prefix
参数的支持将被删除。SimpleTestCase.urls
被删除。for
模板标签中使用不正确的解压缩数量计数引发异常,而不是默默地失败。reverse()
URL的功能被删除。LOGIN_URL
和LOGIN_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
的以下方法和属性将被删除:aggregates
和aggregate_select
add_aggregate
,set_aggregate_mask
和append_aggregate_mask
。django.template.resolve_variable
被删除。django.db.models.options.Options
(Model._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.RegexField
的error_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
参数的默认值的向后兼容性垫片被删除。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
方法。dict
和后端相关的模板对象,而不是分别使用Context
和Template
。current_app
参数被删除:django.shortcuts.render()
一个django.template.Context()
django.template.RequestContext()
django.template.response.TemplateResponse()
dictionary
和context_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()
'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
。2017年9月6日