• Language: en
  • Documentation version: development

Django 5.1 release notes - UNDER DEVELOPMENT

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.

Python compatibility

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.

What’s new in Django 5.1

Minor features


  • The default iteration count for the PBKDF2 password hasher is increased from 720,000 to 870,000.

Asynchronous views





Error Reporting

File Storage

File Uploads


  • 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.

Generic Views



Management Commands



  • 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.

Requests and Responses





  • 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"})




Backwards incompatible changes in 5.1

Database backend API

This section describes changes that may be needed in third-party database backends.


  • Support for PostGIS 2.5 is removed.

Dropped support for MariaDB 10.4

Upstream support for MariaDB 10.4 ends in June 2024. Django 5.1 supports MariaDB 10.5 and higher.

Dropped support for PostgreSQL 12

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.

Features deprecated in 5.1


  • 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.

Features removed in 5.1

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 django.core.files.storage.get_storage_class() function is removed.
Back to Top