2017-09-03 07:08:23 +08:00
|
|
|
============================================
|
|
|
|
Django 2.1 release notes - UNDER DEVELOPMENT
|
|
|
|
============================================
|
|
|
|
|
|
|
|
Welcome to Django 2.1!
|
|
|
|
|
|
|
|
These release notes cover the :ref:`new features <whats-new-2.1>`, as well as
|
|
|
|
some :ref:`backwards incompatible changes <backwards-incompatible-2.1>` you'll
|
|
|
|
want to be aware of when upgrading from Django 2.0 or earlier. We've
|
|
|
|
:ref:`dropped some features<removed-features-2.1>` that have reached the end of
|
|
|
|
their deprecation cycle, and we've :ref:`begun the deprecation process for some
|
|
|
|
features <deprecated-features-2.1>`.
|
|
|
|
|
|
|
|
See the :doc:`/howto/upgrade-version` guide if you're updating an existing
|
|
|
|
project.
|
|
|
|
|
|
|
|
Python compatibility
|
|
|
|
====================
|
|
|
|
|
|
|
|
Django 2.1 supports Python 3.5, 3.6, and 3.7. Django 2.0 is the last version to
|
|
|
|
support Python 3.4. We **highly recommend** and only officially support the
|
|
|
|
latest release of each series.
|
|
|
|
|
|
|
|
.. _whats-new-2.1:
|
|
|
|
|
|
|
|
What's new in Django 2.1
|
|
|
|
========================
|
|
|
|
|
|
|
|
Minor features
|
|
|
|
--------------
|
|
|
|
|
|
|
|
:mod:`django.contrib.admin`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2017-07-05 19:00:10 +08:00
|
|
|
* :attr:`.ModelAdmin.search_fields` now accepts any lookup such as
|
|
|
|
``field__exact``.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
2017-12-22 04:07:17 +08:00
|
|
|
* jQuery is upgraded from version 2.2.3 to 3.2.1.
|
|
|
|
|
2017-09-04 17:24:34 +08:00
|
|
|
* The new :meth:`.ModelAdmin.delete_queryset` method allows customizing the
|
|
|
|
deletion process of the "delete selected objects" action.
|
|
|
|
|
2016-12-30 01:51:26 +08:00
|
|
|
* You can now :ref:`override the the default admin site
|
|
|
|
<overriding-default-admin-site>`.
|
|
|
|
|
2016-02-09 08:35:03 +08:00
|
|
|
* The new :attr:`.ModelAdmin.sortable_by` attribute and
|
|
|
|
:meth:`.ModelAdmin.get_sortable_by` method allow limiting the columns that
|
|
|
|
can be sorted in the change list page.
|
|
|
|
|
2018-02-16 10:00:31 +08:00
|
|
|
* The ``admin_order_field`` attribute for elements in
|
|
|
|
:attr:`.ModelAdmin.list_display` may now be a query expression.
|
|
|
|
|
2017-03-30 17:13:15 +08:00
|
|
|
* The new :meth:`.ModelAdmin.get_deleted_objects()` method allows customizing
|
|
|
|
the deletion process of the delete view and the "delete selected" action.
|
|
|
|
|
2017-09-03 07:08:23 +08:00
|
|
|
:mod:`django.contrib.admindocs`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.auth`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2017-09-10 01:06:20 +08:00
|
|
|
* :djadmin:`createsuperuser` now gives a prompt to allow bypassing the
|
|
|
|
:setting:`AUTH_PASSWORD_VALIDATORS` checks.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
2017-11-15 20:27:53 +08:00
|
|
|
* :class:`~django.contrib.auth.forms.UserCreationForm` and
|
|
|
|
:class:`~django.contrib.auth.forms.UserChangeForm` no longer need to be
|
|
|
|
rewritten for a custom user model.
|
|
|
|
|
2017-09-03 07:08:23 +08:00
|
|
|
:mod:`django.contrib.contenttypes`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.gis`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2018-01-10 00:15:04 +08:00
|
|
|
* The new :meth:`.GEOSGeometry.buffer_with_style` method is a version of
|
|
|
|
:meth:`~.GEOSGeometry.buffer` that allows customizing the style of the
|
|
|
|
buffer.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
|
|
|
:mod:`django.contrib.messages`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.postgres`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.redirects`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.sessions`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.sitemaps`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.sites`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.staticfiles`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.syndication`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Cache
|
|
|
|
~~~~~
|
|
|
|
|
2018-01-25 01:26:19 +08:00
|
|
|
* The :ref:`local-memory cache backend <local-memory-caching>` now uses a
|
|
|
|
least-recently-used (LRU) culling strategy rather than a pseudo-random one.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
|
|
|
CSRF
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Database backends
|
|
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Email
|
|
|
|
~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
File Storage
|
|
|
|
~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
File Uploads
|
|
|
|
~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
|
|
|
|
Forms
|
|
|
|
~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Generic Views
|
|
|
|
~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Internationalization
|
|
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2017-06-28 07:50:26 +08:00
|
|
|
* Added the :meth:`~django.utils.translation.get_supported_language_variant`
|
|
|
|
function.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
|
|
|
Management Commands
|
|
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2018-01-10 00:04:56 +08:00
|
|
|
* The new :option:`inspectdb --include-views` option allows creating models
|
|
|
|
for database views.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
|
|
|
Migrations
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
2017-12-01 22:24:56 +08:00
|
|
|
* Added support for serialization of ``functools.partialmethod`` objects.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
|
|
|
Models
|
|
|
|
~~~~~~
|
|
|
|
|
2017-10-14 09:29:00 +08:00
|
|
|
* Models can now use ``__init_subclass__()`` from :pep:`487`.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
2017-12-19 04:19:57 +08:00
|
|
|
* A ``BinaryField`` may now be set to ``editable=True`` if you wish to include
|
|
|
|
it in model forms.
|
|
|
|
|
2018-02-23 23:23:22 +08:00
|
|
|
* A number of new text database functions are added:
|
|
|
|
:class:`~django.db.models.functions.Chr`,
|
|
|
|
:class:`~django.db.models.functions.Ord`,
|
|
|
|
:class:`~django.db.models.functions.Left`,
|
|
|
|
:class:`~django.db.models.functions.Right`, and
|
|
|
|
:class:`~django.db.models.functions.Replace`.
|
2018-01-18 09:46:15 +08:00
|
|
|
|
2017-09-29 04:39:03 +08:00
|
|
|
* The new :class:`~django.db.models.functions.TruncWeek` function truncates
|
|
|
|
:class:`~django.db.models.DateField` and
|
|
|
|
:class:`~django.db.models.DateTimeField` to the Monday of a week.
|
|
|
|
|
2018-01-28 18:27:15 +08:00
|
|
|
* Query expressions can now be negated using a minus sign.
|
|
|
|
|
2017-06-18 23:53:40 +08:00
|
|
|
* :meth:`.QuerySet.order_by` and :meth:`distinct(*fields) <.QuerySet.distinct>`
|
|
|
|
now support using field transforms.
|
|
|
|
|
2017-09-03 07:08:23 +08:00
|
|
|
Requests and Responses
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2017-11-08 04:58:05 +08:00
|
|
|
* Added :meth:`.HttpRequest.get_full_path_info`.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
|
|
|
Serialization
|
|
|
|
~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Signals
|
|
|
|
~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Templates
|
|
|
|
~~~~~~~~~
|
|
|
|
|
2017-10-13 02:59:38 +08:00
|
|
|
* The new :tfilter:`json_script` filter safely outputs a Python object as JSON,
|
|
|
|
wrapped in a ``<script>`` tag, ready for use with JavaScript.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
|
|
|
Tests
|
|
|
|
~~~~~
|
|
|
|
|
2017-05-22 18:49:39 +08:00
|
|
|
* Added test :class:`~django.test.Client` support for 307 and 308 redirects.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
2018-02-05 18:22:24 +08:00
|
|
|
* The test :class:`~django.test.Client` now serializes a request data
|
|
|
|
dictionary as JSON if ``content_type='application/json'``. You can customize
|
|
|
|
the JSON encoder with test client's ``json_encoder`` parameter.
|
|
|
|
|
2017-09-03 07:08:23 +08:00
|
|
|
URLs
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Validators
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
.. _backwards-incompatible-2.1:
|
|
|
|
|
|
|
|
Backwards incompatible changes in 2.1
|
|
|
|
=====================================
|
|
|
|
|
|
|
|
Database backend API
|
|
|
|
--------------------
|
|
|
|
|
2017-10-07 00:47:08 +08:00
|
|
|
* To adhere to :pep:`249`, exceptions where a database doesn't support a
|
|
|
|
feature are changed from :exc:`NotImplementedError` to
|
|
|
|
:exc:`django.db.NotSupportedError`.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
2018-02-07 15:27:47 +08:00
|
|
|
* Renamed the ``allow_sliced_subqueries`` database feature flag to
|
|
|
|
``allow_sliced_subqueries_with_in``.
|
|
|
|
|
2017-06-18 23:53:40 +08:00
|
|
|
* ``DatabaseOperations.distinct_sql()`` now requires an additional ``params``
|
|
|
|
argument and returns a tuple of SQL and parameters instead of a SQL string.
|
|
|
|
|
2017-10-01 02:13:18 +08:00
|
|
|
:mod:`django.contrib.gis`
|
|
|
|
-------------------------
|
|
|
|
|
|
|
|
* Support for SpatiaLite 4.0 is removed.
|
|
|
|
|
2017-08-25 02:56:09 +08:00
|
|
|
Dropped support for MySQL 5.5
|
|
|
|
-----------------------------
|
|
|
|
|
|
|
|
The end of upstream support for MySQL 5.5 is December 2018. Django 2.1 supports
|
|
|
|
MySQL 5.6 and higher.
|
|
|
|
|
2017-09-06 22:26:45 +08:00
|
|
|
Dropped support for PostgreSQL 9.3
|
|
|
|
----------------------------------
|
|
|
|
|
|
|
|
The end of upstream support for PostgreSQL 9.3 is September 2018. Django 2.1
|
|
|
|
supports PostgreSQL 9.4 and higher.
|
|
|
|
|
2018-02-26 22:05:18 +08:00
|
|
|
Removed ``BCryptPasswordHasher`` from the default ``PASSWORD_HASHERS`` setting
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
If you used bcrypt with Django 1.4 or 1.5 (before ``BCryptSHA256PasswordHasher``
|
|
|
|
was added in Django 1.6), you might have some passwords that use the
|
|
|
|
``BCryptPasswordHasher`` hasher.
|
|
|
|
|
|
|
|
You can check if that's the case like this::
|
|
|
|
|
|
|
|
from django.contrib.auth import get_user_model
|
|
|
|
User = get_user_model()
|
|
|
|
User.objects.filter(password__startswith='bcrypt$$')
|
|
|
|
|
|
|
|
If you want to continue to allow those passwords to be used, you'll
|
|
|
|
have to define the :setting:`PASSWORD_HASHERS` setting (if you don't already)
|
|
|
|
and include ``'django.contrib.auth.hashers.BCryptPasswordHasher'``.
|
|
|
|
|
2017-09-03 07:08:23 +08:00
|
|
|
Miscellaneous
|
|
|
|
-------------
|
|
|
|
|
2017-12-30 00:55:29 +08:00
|
|
|
* The minimum supported version of ``mysqlclient`` is increased from 1.3.3 to
|
|
|
|
1.3.7.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
2017-12-28 05:49:46 +08:00
|
|
|
* The date format of ``Set-Cookie``'s ``Expires`` directive is changed to
|
|
|
|
follow :rfc:`7231#section-7.1.1.1` instead of Netscape's cookie standard.
|
|
|
|
Hyphens present in dates like ``Tue, 25-Dec-2018 22:26:13 GMT`` are removed.
|
|
|
|
This change should be merely cosmetic except perhaps for antiquated browsers
|
|
|
|
that don't parse the new format.
|
|
|
|
|
2018-01-11 20:03:50 +08:00
|
|
|
* ``allowed_hosts`` is now a required argument of private API
|
|
|
|
``django.utils.http.is_safe_url()``.
|
|
|
|
|
2018-01-21 00:19:06 +08:00
|
|
|
* The ``multiple`` attribute rendered by the
|
|
|
|
:class:`~django.forms.SelectMultiple` widget now uses HTML5 boolean syntax
|
2018-01-21 14:41:40 +08:00
|
|
|
rather than XHTML's ``multiple="multiple"``.
|
2018-01-21 00:19:06 +08:00
|
|
|
|
2018-01-21 15:09:10 +08:00
|
|
|
* HTML rendered by form widgets no longer includes a closing slash on void
|
|
|
|
elements, e.g. ``<br>``. This is incompatible within XHTML, although some
|
|
|
|
widgets already used aspects of HTML5 such as boolean attributes.
|
|
|
|
|
2018-01-30 17:33:13 +08:00
|
|
|
* The value of :class:`~django.forms.SelectDateWidget`'s empty options is
|
|
|
|
changed from 0 to an empty string, which mainly may require some adjustments
|
|
|
|
in tests that compare HTML.
|
|
|
|
|
2017-09-03 07:08:23 +08:00
|
|
|
.. _deprecated-features-2.1:
|
|
|
|
|
|
|
|
Features deprecated in 2.1
|
|
|
|
==========================
|
|
|
|
|
|
|
|
Miscellaneous
|
|
|
|
-------------
|
|
|
|
|
2017-11-25 01:30:53 +08:00
|
|
|
* The ``ForceRHR`` GIS function is deprecated in favor of the new
|
|
|
|
:class:`~django.contrib.gis.db.models.functions.ForcePolygonCW` function.
|
2017-09-03 07:08:23 +08:00
|
|
|
|
2017-12-31 03:19:43 +08:00
|
|
|
* ``django.utils.http.cookie_date()`` is deprecated in favor of
|
|
|
|
:func:`~django.utils.http.http_date`, which follows the format of the latest
|
|
|
|
RFC.
|
|
|
|
|
2018-01-22 05:38:52 +08:00
|
|
|
* ``{% load staticfiles %}`` and ``{% load admin_static %}`` are deprecated
|
|
|
|
in favor of ``{% load static %}``, which works the same.
|
|
|
|
|
|
|
|
* ``django.contrib.staticfiles.templatetags.static()`` is deprecated in favor
|
|
|
|
of ``django.templatetags.static.static()``.
|
|
|
|
|
2017-09-03 07:08:23 +08:00
|
|
|
.. _removed-features-2.1:
|
|
|
|
|
|
|
|
Features removed in 2.1
|
|
|
|
=======================
|
|
|
|
|
|
|
|
These features have reached the end of their deprecation cycle and are removed
|
|
|
|
in Django 2.1. See :ref:`deprecated-features-1.11` for details, including how
|
|
|
|
to remove usage of these features.
|
2017-09-03 07:24:18 +08:00
|
|
|
in Django 2.1. See :ref:`deprecated-features-1.11` and for details, including
|
|
|
|
how to remove usage of these features.
|
|
|
|
|
|
|
|
* ``contrib.auth.views.login()``, ``logout()``, ``password_change()``,
|
|
|
|
``password_change_done()``, ``password_reset()``, ``password_reset_done()``,
|
|
|
|
``password_reset_confirm()``, and ``password_reset_complete()`` are removed.
|
2017-09-03 07:45:09 +08:00
|
|
|
|
|
|
|
* The ``extra_context`` parameter of ``contrib.auth.views.logout_then_login()``
|
|
|
|
is removed.
|
2017-09-03 07:48:50 +08:00
|
|
|
|
|
|
|
* ``django.test.runner.setup_databases()`` is removed.
|
2017-09-03 07:54:21 +08:00
|
|
|
|
|
|
|
* ``django.utils.translation.string_concat()`` is removed.
|
2017-09-03 07:59:45 +08:00
|
|
|
|
|
|
|
* ``django.core.cache.backends.memcached.PyLibMCCache`` no longer supports
|
|
|
|
passing ``pylibmc`` behavior settings as top-level attributes of ``OPTIONS``.
|
2017-09-03 08:12:27 +08:00
|
|
|
|
|
|
|
* The ``host`` parameter of ``django.utils.http.is_safe_url()`` is removed.
|
2017-09-03 08:24:01 +08:00
|
|
|
|
|
|
|
* Silencing of exceptions raised while rendering the ``{% include %}`` template
|
|
|
|
tag is removed.
|
2017-09-03 08:28:48 +08:00
|
|
|
|
|
|
|
* ``DatabaseIntrospection.get_indexes()`` is removed.
|
2017-09-03 08:40:47 +08:00
|
|
|
|
|
|
|
* The ``authenticate()`` method of authentication backends requires ``request``
|
|
|
|
as the first positional argument.
|
2017-09-03 08:47:47 +08:00
|
|
|
|
|
|
|
* The ``django.db.models.permalink()`` decorator is removed.
|
2017-09-03 09:09:22 +08:00
|
|
|
|
|
|
|
* The ``USE_ETAGS`` setting is removed. ``CommonMiddleware`` and
|
|
|
|
``django.utils.cache.patch_response_headers()`` no longer set ETags.
|
2017-09-03 09:11:12 +08:00
|
|
|
|
|
|
|
* The ``Model._meta.has_auto_field`` attribute is removed.
|
2017-09-03 09:16:09 +08:00
|
|
|
|
|
|
|
* Support for regular expression groups with ``iLmsu#`` in ``url()`` is removed.
|
2017-09-03 09:21:40 +08:00
|
|
|
|
|
|
|
* Support for ``Widget.render()`` methods without the ``renderer`` argument
|
|
|
|
is removed.
|