Stable Release in branch 1.11 (LTS)
1.11.29
Released 04 Mar 2020
(6 years ago)
SoftwareDjango
Version1.11 (LTS)
StatusLTS
End of life
Supported
Python versions
Python 2.7 - 3.7
Initial release1.11
04 Apr 2017
(9 years ago)
Latest release1.11.29
04 Mar 2020
(6 years ago)
End of
mainstream support
02 Dec 2017
(Ended 8 years ago)
End of
extended support
01 Apr 2020
(Ended 6 years ago)
Release noteshttps://docs.djangoproject.com/en/1.11/releases/
Source codehttps://github.com/django/django/tree/1.11.29
Documentationhttps://docs.djangoproject.com/en/1.11/
Django 1.11 (LTS) ReleasesView full list

What Is New in Django 1.11

Django 1.11 is a Long Term Support (LTS) release, bringing a solid set of new features, improvements, and the usual round of bug fixes. This version sets the foundation for the next few years of stable development.

Category Key Highlights
New Features Class-based model indexes, Subquery expressions, Template-based widget rendering
Improvements Customizable admin pagination, New database operations, django.contrib.postgres enhancements
Backwards Incompatibility Context of Widget.render() changed, Removal of deprecated features
Deprecations Several features deprecated for future removal

How does Django 1.11 improve database querying?

The ORM gets significantly more powerful with the introduction of Subquery expressions. This allows you to use the output of one query directly within the WHERE clause of another, a common SQL pattern that was previously awkward to achieve.

You can now define database indexes directly on your models using a class-based approach. This is much cleaner than the old functional style and allows for more complex index types, like BrinIndex, to be declared intuitively.

Example: Subquery Expression

from django.db.models import OuterRef, Subquery
newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')
Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))

What changes were made to the admin and forms?

Widget rendering has been overhauled to use the Django template system. This makes it far easier to customize the HTML of form widgets without having to override Python methods. You can now create a templates/ directory and drop in your own widget templates.

The admin interface's pagination is now customizable. You can control the number of items shown per page by adding a new list_per_page attribute to your ModelAdmin class, giving you more flexibility for different models.

What should I know about backwards compatibility?

The context passed to the Widget.render() method has changed. If you have custom widgets that override this method, you'll need to update them to accept the new context parameter. This was done to support the new template-based widget rendering.

This release also continues the project's deprecation cycle. Features that were marked for deprecation in older versions, like the django.contrib.webdesign package and the extra_context parameter on SimpleTestCase.assertContains(), have now been removed entirely.

FAQ

Is Django 1.11 an LTS release?
Yes, Django 1.11 is a Long Term Support (LTS) release. This means it will receive security updates and data loss fixes for a longer period, typically three years, making it a preferred choice for production environments that value stability.

What is the main benefit of the new Subquery expression?
It lets you write more efficient and complex database queries directly in the ORM that previously required raw SQL or less performant workarounds. You can now annotate a queryset with data from a related model's subquery in a single operation.

How do I customize a form widget with the new template system?
Instead of overriding the render() method, you now create a template. For a widget named MyTextInput, you would create templates/my_text_input.html and the widget will automatically use it, making HTML customization much simpler.

What was removed in this version that might break my project?
Several previously deprecated features were removed. The most common breakage could come from custom widgets that override Widget.render() without accounting for the new context parameter, or if you were still using the removed django.contrib.webdesign package.

Are there any new indexes besides the class-based syntax?
Yes, the new BrinIndex was introduced for PostgreSQL. This index type is highly space-efficient and can be very effective for large tables with naturally sorted data, like timestamped logs.

Releases In Branch 1.11 (LTS)

VersionRelease date
1.11.2904 Mar 2020
(6 years ago)
1.11.2803 Feb 2020
(6 years ago)
1.11.2718 Dec 2019
(6 years ago)
1.11.2604 Nov 2019
(6 years ago)
1.11.2501 Oct 2019
(6 years ago)
1.11.2402 Sep 2019
(7 years ago)
1.11.2301 Aug 2019
(7 years ago)
1.11.2201 Jul 2019
(7 years ago)
1.11.2103 Jun 2019
(7 years ago)
1.11.2011 Feb 2019
(7 years ago)
1.11.1911 Feb 2019
(7 years ago)
1.11.1804 Jan 2019
(7 years ago)
1.11.1703 Dec 2018
(7 years ago)
1.11.1601 Oct 2018
(7 years ago)
1.11.1501 Aug 2018
(8 years ago)
1.11.1402 Jul 2018
(8 years ago)
1.11.1302 May 2018
(8 years ago)
1.11.1203 Apr 2018
(8 years ago)
1.11.1106 Mar 2018
(8 years ago)
1.11.1001 Feb 2018
(8 years ago)
1.11.902 Jan 2018
(8 years ago)
1.11.802 Dec 2017
(8 years ago)
1.11.702 Nov 2017
(8 years ago)
1.11.605 Oct 2017
(8 years ago)
1.11.505 Sep 2017
(9 years ago)
1.11.401 Aug 2017
(9 years ago)
1.11.301 Jul 2017
(9 years ago)
1.11.201 Jun 2017
(9 years ago)
1.11.106 May 2017
(9 years ago)
1.1104 Apr 2017
(9 years ago)
1.11rc121 Mar 2017
(9 years ago)
1.11b120 Feb 2017
(9 years ago)
1.11a118 Jan 2017
(9 years ago)