Expected August 2024
Welcome to Django 5.1!
These release notes cover the new features, as well as some backwards incompatible changes you'll want to be aware of when upgrading from Django 5.0 or earlier. We've begun the deprecation process for some features.
See the How to upgrade Django to a newer version guide if you're updating an existing project.
Django 5.1 supports Python 3.10, 3.11, and 3.12. We highly recommend and only officially support the latest release of each series.
django.contrib.admin
¶...
django.contrib.admindocs
¶...
django.contrib.auth
¶The default iteration count for the PBKDF2 password hasher is increased from 720,000 to 870,000.
django.contrib.contenttypes
¶...
django.contrib.gis
¶BoundingCircle
is now
supported on SpatiaLite 5.1+.
Collect
is now supported on MySQL
8.0.24+.
GeoIP2
now allows querying using
ipaddress.IPv4Address
or ipaddress.IPv6Address
objects.
GeoIP2.country()
now exposes the continent_code
,
continent_name
, and is_in_european_union
values.
GeoIP2.city()
now exposes the accuracy_radius
and region_name
values. In addition the dma_code
and region
values are now exposed as
metro_code
and region_code
, but the previous keys are also retained
for backward compatibility.
django.contrib.messages
¶...
django.contrib.postgres
¶BTreeIndex
now supports the
deduplicate_items
parameter.
django.contrib.redirects
¶...
django.contrib.sessions
¶...
django.contrib.sitemaps
¶...
django.contrib.sites
¶...
django.contrib.staticfiles
¶...
...
...
...
...
...
...
...
...
In order to improve accessibility and enable screen readers to associate
fieldsets with their help text, the form fieldset now includes the
aria-describedby
HTML attribute.
...
...
...
...
...
QuerySet.explain()
now supports the generic_plan
option on
PostgreSQL 16+.
RowRange
now accepts positive integers
for the start
argument and negative integers for the end
argument.
The new exclusion
argument of
RowRange
and
ValueRange
allows excluding rows,
groups, and ties from the window frames.
QuerySet.order_by()
now supports ordering by annotation transforms
such as JSONObject
keys and ArrayAgg
indices.
F()
and OuterRef()
expressions that output
CharField
, EmailField
,
SlugField
, URLField
,
TextField
, or
ArrayField
can now be sliced.
...
...
...
...
Custom tags may now set extra data on the Parser
object that will later
be made available on the Template
instance. Such data may be used, for
example, by the template loader, or other template clients.
The new {% query_string %}
template tag allows
changing a QueryDict
instance for use in links, for
example, to generate a link to the next page while keeping any filtering
options in place.
assertContains()
,
assertNotContains()
, and
assertInHTML()
assertions now add haystacks
to assertion error messages.
The Django test runner now supports a --screenshots
option to save
screenshots for Selenium tests.
The RequestFactory
,
AsyncRequestFactory
, Client
, and
AsyncClient
classes now support the query_params
parameter, which accepts a dictionary of query string keys and values. This
allows setting query strings on any HTTP methods more easily.
self.client.post("/items/1", query_params={"action": "delete"})
await self.async_client.post("/items/1", query_params={"action": "delete"})
The new SimpleTestCase.assertNotInHTML()
assertion allows testing that
an HTML fragment is not contained in the given HTML haystack.
In order to enforce test isolation, database connections inside threads are
no longer allowed in SimpleTestCase
.
...
...
...
This section describes changes that may be needed in third-party database backends.
...
django.contrib.gis
¶Support for PostGIS 2.5 is removed.
Support for PROJ < 6 is removed.
Support for GDAL 2.4 is removed.
GeoIP2
no longer opens both city and
country databases when a directory path is provided, preferring the city
database, if it is available. The country database is a subset of the city
database and both are not typically needed. If you require use of the country
database when in the same directory as the city database, explicitly pass the
country database path to the constructor.
Upstream support for MariaDB 10.4 ends in June 2024. Django 5.1 supports MariaDB 10.5 and higher.
Upstream support for PostgreSQL 12 ends in November 2024. Django 5.1 supports PostgreSQL 13 and higher.
In order to improve accessibility, the admin's changelist filter is now
rendered in a <nav>
tag instead of a <div>
.
SimpleTestCase.assertURLEqual()
and
assertInHTML()
now add ": "
to the
msg_prefix
. This is consistent with the behavior of other assertions.
The ModelAdmin.log_deletion()
and LogEntryManager.log_action()
methods are deprecated. Subclasses should implement
ModelAdmin.log_deletions()
and LogEntryManager.log_actions()
instead.
The undocumented django.utils.itercompat.is_iterable()
function and the
django.utils.itercompat
module are deprecated. Use
isinstance(..., collections.abc.Iterable)
instead.
The django.contrib.gis.geoip2.GeoIP2.coords()
method is deprecated. Use
django.contrib.gis.geoip2.GeoIP2.lon_lat()
instead.
The django.contrib.gis.geoip2.GeoIP2.open()
method is deprecated. Use the
GeoIP2
constructor instead.
Passing positional arguments to Model.save()
and Model.asave()
is deprecated in favor of keyword-only arguments.
These features have reached the end of their deprecation cycle and are removed in Django 5.1.
See Features deprecated in 4.2 for details on these changes, including how to remove usage of these features.
The BaseUserManager.make_random_password()
method is removed.
The model's Meta.index_together
option is removed.
The length_is
template filter is removed.
The django.contrib.auth.hashers.SHA1PasswordHasher
,
django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher
, and
django.contrib.auth.hashers.UnsaltedMD5PasswordHasher
are removed.
The model django.contrib.postgres.fields.CICharField
,
django.contrib.postgres.fields.CIEmailField
, and
django.contrib.postgres.fields.CITextField
are removed, except for
support in historical migrations.
The django.contrib.postgres.fields.CIText
mixin is removed.
The map_width
and map_height
attributes of BaseGeometryWidget
are
removed.
The SimpleTestCase.assertFormsetError()
method is removed.
The TransactionTestCase.assertQuerysetEqual()
method is removed.
Support for passing encoded JSON string literals to JSONField
and
associated lookups and expressions is removed.
Support for passing positional arguments to Signer
and
TimestampSigner
is removed.
The DEFAULT_FILE_STORAGE
and STATICFILES_STORAGE
settings is removed.
The django.core.files.storage.get_storage_class()
function is removed.
Jan 15, 2024