February 1, 2016
Django 1.9.2 fixes a security regression in 1.9 and several bugs in 1.9.1. It also makes a small backwards incompatible change that hopefully doesn’t affect any users.
ModelAdmin
’s with save_as=True
¶If a ModelAdmin
uses save_as=True
(not the default), the admin
provides an option when editing objects to “Save as new”. A regression in
Django 1.9 prevented that form submission from raising a “Permission Denied”
error for users without the “add” permission.
.py-tpl
files rewritten in project/app templates¶The addition of some Django template language syntax to the default app
template in Django 1.9 means those files now have some invalid Python syntax.
This causes difficulties for packaging systems that unconditionally
byte-compile *.py
files.
To remedy this, a .py-tpl
suffix is now used for the project and app
template files included in Django. The .py-tpl
suffix is replaced with
.py
by the startproject
and startapp
commands. For example, a
template with the filename manage.py-tpl
will be created as manage.py
.
Please file a ticket if you have a custom project template containing
.py-tpl
files and find this behavior problematic.
ConditionalGetMiddleware
causing If-None-Match
checks to always return HTTP 200 (#26024).db_index=True
or unique=True
to a
CharField
or TextField
that already had the other specified, or when
removing one of them from a field that had both, or when adding
unique=True
to a field already listed in unique_together
(#26034).USE_X_FORWARDED_PORT=True
(#26094).QuerySet.order_by()
crash when ordering by a relational field of
a ManyToManyField
through
model (#26092).DEBUG
is True
on
distributions that increase the SQLITE_MAX_VARIABLE_NUMBER
compile-time
limit to over 2000, such as Debian (#26063).OneToOneField
in
ModelAdmin.readonly_fields
(#26060).migrate
command in a test case with the
available_apps
attribute pointing to an application with migrations
disabled using the MIGRATION_MODULES
setting (#26135).Node.token.source[0]
. This was an undocumented,
private API. The origin is now available directly on each node using the
Node.origin
attribute (#25848).SimpleLazyObject
with copy.copy()
(#26122).geometry_field
in the GeoJSON serializer output regardless
of the fields
parameter (#26138).contrib.gis
map widgets when using
USE_THOUSAND_SEPARATOR=True
(#20415).Jun 22, 2017