2016-11-07 20:03:37 +00:00
|
|
|
============================================
|
|
|
|
Django 2.0 release notes - UNDER DEVELOPMENT
|
|
|
|
============================================
|
|
|
|
|
|
|
|
Welcome to Django 2.0!
|
|
|
|
|
|
|
|
These release notes cover the :ref:`new features <whats-new-2.0>`, as well as
|
|
|
|
some :ref:`backwards incompatible changes <backwards-incompatible-2.0>` you'll
|
|
|
|
want to be aware of when upgrading from Django 1.11 or earlier. We've
|
|
|
|
:ref:`dropped some features<removed-features-2.0>` that have reached the end of
|
|
|
|
their deprecation cycle, and we've :ref:`begun the deprecation process for some
|
|
|
|
features <deprecated-features-2.0>`.
|
|
|
|
|
|
|
|
See the :doc:`/howto/upgrade-version` guide if you're updating an existing
|
|
|
|
project.
|
|
|
|
|
|
|
|
Python compatibility
|
|
|
|
====================
|
|
|
|
|
2017-08-11 15:17:08 +00:00
|
|
|
Django 2.0 supports Python 3.4, 3.5, and 3.6. We **highly recommend** and only
|
|
|
|
officially support the latest release of each series.
|
|
|
|
|
|
|
|
The Django 1.11.x series is the last to support Python 2.7.
|
|
|
|
|
|
|
|
Django 2.0 will be the last release series to support Python 3.4. If you plan
|
|
|
|
a deployment of Python 3.4 beyond the end-of-life for Django 2.0 (April 2019),
|
|
|
|
stick with Django 1.11 LTS (supported until April 2020) instead. Note, however,
|
|
|
|
that the end-of-life for Python 3.4 is March 2019.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
|
|
|
Third-party library support for older version of Django
|
|
|
|
=======================================================
|
|
|
|
|
|
|
|
Following the release of Django 2.0, we suggest that third-party app authors
|
|
|
|
drop support for all versions of Django prior to 1.11. At that time, you should
|
2017-08-15 13:41:49 +00:00
|
|
|
be able to run your package's tests using ``python -Wd`` so that deprecation
|
2016-11-07 20:03:37 +00:00
|
|
|
warnings do appear. After making the deprecation warning fixes, your app should
|
|
|
|
be compatible with Django 2.0.
|
|
|
|
|
|
|
|
.. _whats-new-2.0:
|
|
|
|
|
|
|
|
What's new in Django 2.0
|
|
|
|
========================
|
|
|
|
|
|
|
|
Minor features
|
|
|
|
--------------
|
|
|
|
|
|
|
|
:mod:`django.contrib.admin`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.admindocs`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.auth`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2017-01-17 14:54:04 +00:00
|
|
|
* The default iteration count for the PBKDF2 password hasher is increased from
|
|
|
|
36,000 to 100,000.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
|
|
|
:mod:`django.contrib.contenttypes`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.gis`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2017-04-01 17:43:53 +00:00
|
|
|
* Added MySQL support for the
|
|
|
|
:class:`~django.contrib.gis.db.models.functions.AsGeoJSON` function,
|
|
|
|
:class:`~django.contrib.gis.db.models.functions.GeoHash` function,
|
2017-07-26 07:40:19 +00:00
|
|
|
:class:`~django.contrib.gis.db.models.functions.IsValid` function,
|
|
|
|
:lookup:`isvalid` lookup, and :ref:`distance lookups <distance-lookups>`.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
2017-04-02 18:24:06 +00:00
|
|
|
* Added the :class:`~django.contrib.gis.db.models.functions.Azimuth` and
|
|
|
|
:class:`~django.contrib.gis.db.models.functions.LineLocatePoint` functions,
|
|
|
|
supported on PostGIS and SpatiaLite.
|
2017-04-01 19:02:09 +00:00
|
|
|
|
2017-03-30 15:17:13 +00:00
|
|
|
* Any :class:`~django.contrib.gis.geos.GEOSGeometry` imported from GeoJSON now
|
|
|
|
has its SRID set.
|
|
|
|
|
2017-05-14 18:31:17 +00:00
|
|
|
* Added the :attr:`.OSMWidget.default_zoom` attribute to customize the map's
|
|
|
|
default zoom level.
|
|
|
|
|
2017-05-23 19:07:16 +00:00
|
|
|
* Made metadata readable and editable on rasters through the
|
|
|
|
:attr:`~django.contrib.gis.gdal.GDALRaster.metadata`,
|
|
|
|
:attr:`~django.contrib.gis.gdal.GDALRaster.info`, and
|
|
|
|
:attr:`~django.contrib.gis.gdal.GDALBand.metadata` attributes.
|
|
|
|
|
2017-06-08 14:51:19 +00:00
|
|
|
* Allowed passing driver-specific creation options to
|
|
|
|
:class:`~django.contrib.gis.gdal.GDALRaster` objects using ``papsz_options``.
|
|
|
|
|
2017-06-16 16:09:05 +00:00
|
|
|
* Allowed creating :class:`~django.contrib.gis.gdal.GDALRaster` objects in
|
|
|
|
GDAL's internal virtual filesystem. Rasters can now be :ref:`created from and
|
|
|
|
converted to binary data <gdal-raster-vsimem>` in-memory.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
:mod:`django.contrib.messages`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.postgres`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2017-01-23 15:34:42 +00:00
|
|
|
* The new ``distinct`` argument for
|
|
|
|
:class:`~django.contrib.postgres.aggregates.ArrayAgg` determines if
|
|
|
|
concatenated values will be distinct.
|
2017-03-29 21:52:42 +00:00
|
|
|
|
|
|
|
* The new :class:`~django.contrib.postgres.functions.RandomUUID` database
|
|
|
|
function returns a version 4 UUID. It requires use of PostgreSQL's
|
|
|
|
``pgcrypto`` extension which can be activated using the new
|
|
|
|
:class:`~django.contrib.postgres.operations.CryptoExtension` migration
|
|
|
|
operation.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
2017-05-30 21:17:32 +00:00
|
|
|
* :class:`django.contrib.postgres.indexes.GinIndex` now supports the
|
2017-08-09 18:48:36 +00:00
|
|
|
``fastupdate`` and ``gin_pending_list_limit`` parameters.
|
2017-05-30 21:17:32 +00:00
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
:mod:`django.contrib.redirects`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.sessions`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.sitemaps`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2017-02-15 09:36:18 +00:00
|
|
|
* Added the ``protocol`` keyword argument to the
|
|
|
|
:class:`~django.contrib.sitemaps.GenericSitemap` constructor.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
|
|
|
:mod:`django.contrib.sites`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.staticfiles`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
:mod:`django.contrib.syndication`
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Cache
|
|
|
|
~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
CSRF
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Database backends
|
|
|
|
~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Email
|
|
|
|
~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
File Storage
|
|
|
|
~~~~~~~~~~~~
|
|
|
|
|
2017-04-07 13:41:39 +00:00
|
|
|
* :meth:`File.open() <django.core.files.File.open>` can be used as a context
|
|
|
|
manager, e.g. ``with file.open() as f:``.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
|
|
|
File Uploads
|
|
|
|
~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Forms
|
|
|
|
~~~~~
|
|
|
|
|
2017-01-13 11:48:30 +00:00
|
|
|
* The new ``date_attrs`` and ``time_attrs`` arguments for
|
|
|
|
:class:`~django.forms.SplitDateTimeWidget` and
|
|
|
|
:class:`~django.forms.SplitHiddenDateTimeWidget` allow specifying different
|
|
|
|
HTML attributes for the ``DateInput`` and ``TimeInput`` (or hidden)
|
|
|
|
subwidgets.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
2017-03-09 23:45:50 +00:00
|
|
|
* The new :meth:`Form.errors.get_json_data()
|
|
|
|
<django.forms.Form.errors.get_json_data>` method returns form errors as
|
|
|
|
a dictionary suitable for including in a JSON response.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
Generic Views
|
|
|
|
~~~~~~~~~~~~~
|
|
|
|
|
2017-07-06 14:34:54 +00:00
|
|
|
* The new :attr:`.ContextMixin.extra_context` attribute allows adding context
|
|
|
|
in ``View.as_view()``.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
|
|
|
Internationalization
|
|
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Management Commands
|
|
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2017-03-08 15:56:00 +00:00
|
|
|
* :djadmin:`inspectdb` now translates MySQL's unsigned integer columns to
|
|
|
|
``PositiveIntegerField`` or ``PositiveSmallIntegerField``.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
2017-04-07 17:46:45 +00:00
|
|
|
* The new :option:`makemessages --add-location` option controls the comment
|
|
|
|
format in PO files.
|
|
|
|
|
2017-03-26 19:29:05 +00:00
|
|
|
* :djadmin:`loaddata` can now :ref:`read from stdin <loading-fixtures-stdin>`.
|
|
|
|
|
2017-03-08 08:54:17 +00:00
|
|
|
* The new :option:`diffsettings --output` option allows formatting the output
|
|
|
|
in a unified diff format.
|
|
|
|
|
2017-06-01 09:51:02 +00:00
|
|
|
* On Oracle, :djadmin:`inspectdb` can now introspect ``AutoField`` if the
|
|
|
|
column is created as an identity column.
|
|
|
|
|
2017-06-19 22:11:25 +00:00
|
|
|
* On MySQL, :djadmin:`dbshell` now supports client-side TLS certificates.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
Migrations
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
2017-02-20 14:45:20 +00:00
|
|
|
* The new :option:`squashmigrations --squashed-name` option allows naming
|
|
|
|
the squashed migration.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
|
|
|
Models
|
|
|
|
~~~~~~
|
|
|
|
|
2017-02-21 06:43:38 +00:00
|
|
|
* The new :class:`~django.db.models.functions.StrIndex` database function
|
|
|
|
finds the starting index of a string inside another string.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
2017-06-01 09:49:57 +00:00
|
|
|
* On Oracle, ``AutoField`` and ``BigAutoField`` are now created as `identity
|
|
|
|
columns`_.
|
|
|
|
|
|
|
|
.. _`identity columns`: https://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA109
|
|
|
|
|
2017-06-01 20:56:51 +00:00
|
|
|
* The new ``chunk_size`` parameter of :meth:`.QuerySet.iterator` controls the
|
|
|
|
number of rows fetched by the Python database client when streaming results
|
|
|
|
from the database. For databases that don't support server-side cursors, it
|
|
|
|
controls the number of results Django fetches from the database adapter.
|
|
|
|
|
2017-06-08 19:15:29 +00:00
|
|
|
* Added the :class:`~django.db.models.functions.datetime.ExtractQuarter`
|
|
|
|
function to extract the quarter from :class:`~django.db.models.DateField` and
|
|
|
|
:class:`~django.db.models.DateTimeField`, and exposed it through the
|
|
|
|
:lookup:`quarter` lookup.
|
|
|
|
|
|
|
|
* Added the :class:`~django.db.models.functions.datetime.TruncQuarter`
|
|
|
|
function to truncate :class:`~django.db.models.DateField` and
|
|
|
|
:class:`~django.db.models.DateTimeField` to the first day of a quarter.
|
|
|
|
|
2017-06-27 19:15:15 +00:00
|
|
|
* Added the :attr:`~django.db.models.Index.db_tablespace` parameter to
|
|
|
|
class-based indexes.
|
|
|
|
|
2016-11-23 15:36:11 +00:00
|
|
|
* If the database supports a native duration field (Oracle and PostgreSQL),
|
|
|
|
:class:`~django.db.models.functions.datetime.Extract` now works with
|
|
|
|
:class:`~django.db.models.DurationField`.
|
|
|
|
|
2017-06-29 20:00:15 +00:00
|
|
|
* Added the ``of`` argument to :meth:`.QuerySet.select_for_update()`, supported
|
|
|
|
on PostgreSQL and Oracle, to lock only rows from specific tables rather than
|
|
|
|
all selected tables. It may be helpful particularly when
|
|
|
|
:meth:`~.QuerySet.select_for_update()` is used in conjunction with
|
|
|
|
:meth:`~.QuerySet.select_related()`.
|
|
|
|
|
2017-03-28 15:57:23 +00:00
|
|
|
* The new ``field_name`` parameter of :meth:`.QuerySet.in_bulk` allows fetching
|
|
|
|
results based on any unique model field.
|
|
|
|
|
2017-08-12 19:06:49 +00:00
|
|
|
* :meth:`.CursorWrapper.callproc()` now takes an optional dictionary of keyword
|
|
|
|
parameters, if the backend supports this feature. Of Django's built-in
|
|
|
|
backends, only Oracle supports it.
|
|
|
|
|
2017-04-22 15:44:51 +00:00
|
|
|
* The new ``filter`` argument for built-in aggregates allows :ref:`adding
|
|
|
|
different conditionals <conditional-aggregation>` to multiple aggregations
|
|
|
|
over the same fields or relations.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
Requests and Responses
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
2015-10-30 23:38:34 +00:00
|
|
|
* The :djadmin:`runserver` Web server supports HTTP 1.1.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
|
|
|
Serialization
|
|
|
|
~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Signals
|
|
|
|
~~~~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Templates
|
|
|
|
~~~~~~~~~
|
|
|
|
|
2017-03-10 20:46:37 +00:00
|
|
|
* To increase the usefulness of :meth:`.Engine.get_default` in third-party
|
|
|
|
apps, it now returns the first engine if multiple ``DjangoTemplates`` engines
|
|
|
|
are configured in ``TEMPLATES`` rather than raising ``ImproperlyConfigured``.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
2017-05-11 14:09:44 +00:00
|
|
|
* Custom template tags may now accept keyword-only arguments.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
Tests
|
|
|
|
~~~~~
|
|
|
|
|
2016-12-06 19:38:43 +00:00
|
|
|
* Added threading support to :class:`~django.test.LiveServerTestCase`.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
2017-06-02 16:35:56 +00:00
|
|
|
* Added settings that allow customizing the test tablespace parameters for
|
|
|
|
Oracle: :setting:`DATAFILE_SIZE`, :setting:`DATAFILE_TMP_SIZE`,
|
|
|
|
:setting:`DATAFILE_EXTSIZE`, and :setting:`DATAFILE_TMP_EXTSIZE`.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
URLs
|
|
|
|
~~~~
|
|
|
|
|
|
|
|
* ...
|
|
|
|
|
|
|
|
Validators
|
|
|
|
~~~~~~~~~~
|
|
|
|
|
2017-06-23 15:06:08 +00:00
|
|
|
* The new :class:`.ProhibitNullCharactersValidator` disallows the null
|
|
|
|
character in the input of the :class:`~django.forms.CharField` form field
|
|
|
|
and its subclasses. Null character input was observed from vulnerability
|
|
|
|
scanning tools. Most databases silently discard null characters, but
|
|
|
|
psycopg2 2.7+ raises an exception when trying to save a null character to
|
|
|
|
a char/text field with PostgreSQL.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
|
|
|
.. _backwards-incompatible-2.0:
|
|
|
|
|
|
|
|
Backwards incompatible changes in 2.0
|
|
|
|
=====================================
|
|
|
|
|
2017-01-26 08:37:07 +00:00
|
|
|
Removed support for bytestrings in some places
|
|
|
|
----------------------------------------------
|
|
|
|
|
|
|
|
To support native Python 2 strings, older Django versions had to accept both
|
|
|
|
bytestrings and unicode strings. Now that Python 2 support is dropped,
|
|
|
|
bytestrings should only be encountered around input/output boundaries (handling
|
|
|
|
of binary fields or HTTP streams, for example). You might have to update your
|
|
|
|
code to limit bytestring usage to a minimum, as Django no longer accepts
|
|
|
|
bytestrings in certain code paths.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
Database backend API
|
|
|
|
--------------------
|
|
|
|
|
2017-06-06 15:33:09 +00:00
|
|
|
This section describes changes that may be needed in third-party database
|
|
|
|
backends.
|
|
|
|
|
2017-02-01 13:48:04 +00:00
|
|
|
* The ``DatabaseOperations.datetime_cast_date_sql()``,
|
2017-07-06 11:37:47 +00:00
|
|
|
``datetime_cast_time_sql()``, ``datetime_trunc_sql()``,
|
|
|
|
``datetime_extract_sql()``, and ``date_interval_sql()`` methods now return
|
|
|
|
only the SQL to perform the operation instead of SQL and a list of
|
|
|
|
parameters.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
2017-05-23 13:09:35 +00:00
|
|
|
* Third-party database backends should add a ``DatabaseWrapper.display_name``
|
|
|
|
attribute with the name of the database that your backend works with. Django
|
|
|
|
may use it in various messages, such as in system checks.
|
|
|
|
|
2017-06-06 15:08:40 +00:00
|
|
|
* The first argument of ``SchemaEditor._alter_column_type_sql()`` is now
|
|
|
|
``model`` rather than ``table``.
|
|
|
|
|
2017-04-01 18:00:47 +00:00
|
|
|
* The first argument of ``SchemaEditor._create_index_name()`` is now
|
|
|
|
``table_name`` rather than ``model``.
|
|
|
|
|
2017-06-29 20:00:15 +00:00
|
|
|
* To enable ``FOR UPDATE OF`` support, set
|
|
|
|
``DatabaseFeatures.has_select_for_update_of = True``. If the database
|
|
|
|
requires that the arguments to ``OF`` be columns rather than tables, set
|
|
|
|
``DatabaseFeatures.select_for_update_of_column = True``.
|
|
|
|
|
2017-07-27 17:36:47 +00:00
|
|
|
* Third-party database backends should add a
|
|
|
|
``DatabaseOperations.cast_char_field_without_max_length`` attribute with the
|
|
|
|
database data type that will be used in the
|
|
|
|
:class:`~django.db.models.functions.Cast` function for a ``CharField`` if the
|
|
|
|
``max_length`` argument isn't provided.
|
|
|
|
|
2017-01-28 13:19:47 +00:00
|
|
|
Dropped support for Oracle 11.2
|
|
|
|
-------------------------------
|
|
|
|
|
|
|
|
The end of upstream support for Oracle 11.2 is Dec. 2020. Django 1.11 will be
|
|
|
|
supported until April 2020 which almost reaches this date. Django 2.0
|
|
|
|
officially supports Oracle 12.1+.
|
|
|
|
|
2017-02-01 20:34:17 +00:00
|
|
|
Default MySQL isolation level is read committed
|
|
|
|
-----------------------------------------------
|
|
|
|
|
|
|
|
MySQL's default isolation level, repeatable read, may cause data loss in
|
|
|
|
typical Django usage. To prevent that and for consistency with other databases,
|
|
|
|
the default isolation level is now read committed. You can use the
|
|
|
|
:setting:`DATABASES` setting to :ref:`use a different isolation level
|
|
|
|
<mysql-isolation-level>`, if needed.
|
|
|
|
|
2017-01-22 14:45:42 +00:00
|
|
|
:attr:`AbstractUser.last_name <django.contrib.auth.models.User.last_name>` ``max_length`` increased to 150
|
|
|
|
----------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
A migration for :attr:`django.contrib.auth.models.User.last_name` is included.
|
|
|
|
If you have a custom user model inheriting from ``AbstractUser``, you'll need
|
|
|
|
to generate and apply a database migration for your user model.
|
|
|
|
|
|
|
|
If you want to preserve the 30 character limit for last names, use a custom
|
|
|
|
form::
|
|
|
|
|
|
|
|
from django.contrib.auth.forms import UserChangeForm
|
|
|
|
|
|
|
|
class MyUserChangeForm(UserChangeForm):
|
|
|
|
last_name = forms.CharField(max_length=30, required=False)
|
|
|
|
|
|
|
|
If you wish to keep this restriction in the admin when editing users, set
|
|
|
|
``UserAdmin.form`` to use this form::
|
|
|
|
|
|
|
|
from django.contrib.auth.admin import UserAdmin
|
|
|
|
from django.contrib.auth.models import User
|
|
|
|
|
|
|
|
class MyUserAdmin(UserAdmin):
|
|
|
|
form = MyUserChangeForm
|
|
|
|
|
|
|
|
admin.site.unregister(User)
|
|
|
|
admin.site.register(User, MyUserAdmin)
|
|
|
|
|
2014-05-17 12:59:57 +00:00
|
|
|
``QuerySet.reverse()`` and ``last()`` are prohibited after slicing
|
|
|
|
------------------------------------------------------------------
|
|
|
|
|
|
|
|
Calling ``QuerySet.reverse()`` or ``last()`` on a sliced queryset leads to
|
|
|
|
unexpected results due to the slice being applied after reordering. This is
|
|
|
|
now prohibited, e.g.::
|
|
|
|
|
|
|
|
>>> Model.objects.all()[:2].reverse()
|
|
|
|
Traceback (most recent call last):
|
|
|
|
...
|
|
|
|
TypeError: Cannot reverse a query once a slice has been taken.
|
|
|
|
|
2017-06-03 14:49:01 +00:00
|
|
|
Form fields no longer accept optional arguments as positional arguments
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
|
|
|
|
To help prevent runtime errors due to incorrect ordering of form field
|
|
|
|
arguments, optional arguments of built-in form fields are no longer accepted
|
|
|
|
as positional arguments. For example::
|
|
|
|
|
|
|
|
forms.IntegerField(25, 10)
|
|
|
|
|
|
|
|
raises an exception and should be replaced with::
|
|
|
|
|
|
|
|
forms.IntegerField(max_value=25, min_value=10)
|
|
|
|
|
2017-01-28 10:32:33 +00:00
|
|
|
``call_command()`` validates the options it receives
|
|
|
|
----------------------------------------------------
|
|
|
|
|
|
|
|
``call_command()`` now validates that the argument parser of the command being
|
|
|
|
called defines all of the options passed to ``call_command()``.
|
|
|
|
|
|
|
|
For custom management commands that use options not created using
|
|
|
|
``parser.add_argument()``, add a ``stealth_options`` attribute on the command::
|
|
|
|
|
|
|
|
class MyCommand(BaseCommand):
|
|
|
|
stealth_options = ('option_name', ...)
|
|
|
|
|
2017-06-27 17:39:37 +00:00
|
|
|
Indexes no longer accept positional arguments
|
|
|
|
---------------------------------------------
|
|
|
|
|
|
|
|
For example::
|
|
|
|
|
|
|
|
models.Index(['headline', '-pub_date'], 'index_name')
|
|
|
|
|
|
|
|
raises an exception and should be replaced with::
|
|
|
|
|
|
|
|
models.Index(fields=['headline', '-pub_date'], name='index_name')
|
|
|
|
|
2015-01-10 16:24:16 +00:00
|
|
|
Foreign key constraints are now enabled on SQLite
|
|
|
|
-------------------------------------------------
|
|
|
|
|
|
|
|
This will appear as a backwards-incompatible change (``IntegrityError:
|
|
|
|
FOREIGN KEY constraint failed``) if attempting to save an existing model
|
|
|
|
instance that's violating a foreign key constraint.
|
|
|
|
|
|
|
|
Foreign keys are now created with ``DEFERRABLE INITIALLY DEFERRED`` instead of
|
|
|
|
``DEFERRABLE IMMEDIATE``. Thus, tables may need to be rebuilt to recreate
|
|
|
|
foreign keys with the new definition, particularly if you're using a pattern
|
|
|
|
like this::
|
|
|
|
|
|
|
|
from django.db import transaction
|
|
|
|
|
|
|
|
with transaction.atomic():
|
|
|
|
Book.objects.create(author_id=1)
|
|
|
|
Author.objects.create(id=1)
|
|
|
|
|
|
|
|
If you don't recreate the foreign key as ``DEFERRED``, the first ``create()``
|
|
|
|
would fail now that foreign key constraints are enforced.
|
|
|
|
|
|
|
|
Backup your database first! After upgrading to Django 2.0, you can then
|
|
|
|
rebuild tables using a script similar to this::
|
|
|
|
|
|
|
|
from django.apps import apps
|
|
|
|
from django.db import connection
|
|
|
|
|
|
|
|
for app in apps.get_app_configs():
|
|
|
|
for model in app.get_models(include_auto_created=True):
|
|
|
|
if model._meta.managed and not (model._meta.proxy or model._meta.swapped):
|
|
|
|
for base in model.__bases__:
|
|
|
|
if hasattr(base, '_meta'):
|
|
|
|
base._meta.local_many_to_many = []
|
|
|
|
model._meta.local_many_to_many = []
|
|
|
|
with connection.schema_editor() as editor:
|
|
|
|
editor._remake_table(model)
|
|
|
|
|
|
|
|
This script hasn't received extensive testing and needs adaption for various
|
|
|
|
cases such as multiple databases. Feel free to contribute improvements.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
Miscellaneous
|
|
|
|
-------------
|
|
|
|
|
2016-12-31 18:58:42 +00:00
|
|
|
* The ``SessionAuthenticationMiddleware`` class is removed. It provided no
|
|
|
|
functionality since session authentication is unconditionally enabled in
|
|
|
|
Django 1.10.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
2017-01-27 21:13:40 +00:00
|
|
|
* The default HTTP error handlers (``handler404``, etc.) are now callables
|
|
|
|
instead of dotted Python path strings. Django favors callable references
|
|
|
|
since they provide better performance and debugging experience.
|
|
|
|
|
2017-02-28 19:07:57 +00:00
|
|
|
* :class:`~django.views.generic.base.RedirectView` no longer silences
|
|
|
|
``NoReverseMatch`` if the ``pattern_name`` doesn't exist.
|
|
|
|
|
2017-05-05 22:45:07 +00:00
|
|
|
* When :setting:`USE_L10N` is off, :class:`~django.forms.FloatField` and
|
|
|
|
:class:`~django.forms.DecimalField` now respect :setting:`DECIMAL_SEPARATOR`
|
|
|
|
and :setting:`THOUSAND_SEPARATOR` during validation. For example, with the
|
|
|
|
settings::
|
|
|
|
|
|
|
|
USE_L10N = False
|
|
|
|
USE_THOUSAND_SEPARATOR = True
|
|
|
|
DECIMAL_SEPARATOR = ','
|
|
|
|
THOUSAND_SEPARATOR = '.'
|
|
|
|
|
|
|
|
an input of ``"1.345"`` is now converted to ``1345`` instead of ``1.345``.
|
|
|
|
|
2017-04-19 17:02:55 +00:00
|
|
|
* Subclasses of :class:`~django.contrib.auth.models.AbstractBaseUser` are no
|
|
|
|
longer required to implement ``get_short_name()`` and ``get_full_name()``.
|
|
|
|
(The base implementations that raise ``NotImplementedError`` are removed.)
|
|
|
|
``django.contrib.admin`` uses these methods if implemented but doesn't
|
|
|
|
require them. Third-party apps that use these methods may want to adopt a
|
|
|
|
similar approach.
|
|
|
|
|
2017-04-27 08:50:48 +00:00
|
|
|
* The ``FIRST_DAY_OF_WEEK`` and ``NUMBER_GROUPING`` format settings are now
|
|
|
|
kept as integers in JavaScript and JSON i18n view outputs.
|
|
|
|
|
2017-05-14 19:46:23 +00:00
|
|
|
* :meth:`~django.test.TransactionTestCase.assertNumQueries` now ignores
|
|
|
|
connection configuration queries. Previously, if a test opened a new database
|
|
|
|
connection, those queries could be included as part of the
|
|
|
|
``assertNumQueries()`` count.
|
|
|
|
|
2017-05-27 20:27:13 +00:00
|
|
|
* The ``PASSWORD_RESET_TIMEOUT_DAYS`` setting is more properly respected in
|
|
|
|
``contrib.auth`` password reset. Previously, resets were allowed for one day
|
|
|
|
longer than expected. For example, with the default of
|
|
|
|
``PASSWORD_RESET_TIMEOUT_DAYS = 3``, password reset tokens are now valid for
|
|
|
|
72 hours rather than 96 hours.
|
|
|
|
|
2017-06-02 16:35:56 +00:00
|
|
|
* The default size of the Oracle test tablespace is increased from 20M to 50M
|
|
|
|
and the default autoextend size is increased from 10M to 25M.
|
|
|
|
|
2017-06-06 15:33:09 +00:00
|
|
|
* To improve performance when streaming large result sets from the database,
|
|
|
|
:meth:`.QuerySet.iterator` now fetches 2000 rows at a time instead of 100.
|
|
|
|
The old behavior can be restored using the ``chunk_size`` parameter. For
|
|
|
|
example::
|
|
|
|
|
|
|
|
Book.objects.iterator(chunk_size=100)
|
|
|
|
|
2017-04-02 18:14:39 +00:00
|
|
|
* Providing unknown package names in the ``packages`` argument of the
|
|
|
|
:class:`~django.views.i18n.JavaScriptCatalog` view now raises ``ValueError``
|
|
|
|
instead of passing silently.
|
|
|
|
|
2017-04-08 18:38:48 +00:00
|
|
|
* A model instance's primary key now appears in the default ``Model.__str__()``
|
|
|
|
method, e.g. ``Question object (1)``.
|
|
|
|
|
2016-11-11 01:38:16 +00:00
|
|
|
* ``makemigrations`` now detects changes to the model field ``limit_choices_to``
|
|
|
|
option. Add this to your existing migrations or accept an auto-generated
|
|
|
|
migration for fields that use it.
|
|
|
|
|
2017-06-26 11:42:31 +00:00
|
|
|
* Performing queries that require :ref:`automatic spatial transformations
|
|
|
|
<automatic-spatial-transformations>` now raises ``NotImplementedError``
|
|
|
|
on MySQL instead of silently using non-transformed geometries.
|
|
|
|
|
2017-07-14 14:07:18 +00:00
|
|
|
* ``django.core.exceptions.DjangoRuntimeWarning`` is removed. It was only used
|
|
|
|
in the cache backend as an intermediate class in ``CacheKeyWarning``'s
|
|
|
|
inheritance of ``RuntimeWarning``.
|
|
|
|
|
2017-07-15 01:56:01 +00:00
|
|
|
* Renamed ``BaseExpression._output_field`` to ``output_field``. You may need
|
|
|
|
to update custom expressions.
|
|
|
|
|
2017-07-20 15:06:30 +00:00
|
|
|
* In older versions, forms and formsets combine their ``Media`` with widget
|
|
|
|
``Media`` by concatenating the two. The combining now tries to :ref:`preserve
|
|
|
|
the relative order of elements in each list <form-media-asset-order>`.
|
|
|
|
``MediaOrderConflictWarning`` is issued if the order can't be preserved.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
.. _deprecated-features-2.0:
|
|
|
|
|
|
|
|
Features deprecated in 2.0
|
|
|
|
==========================
|
|
|
|
|
2017-07-06 17:18:05 +00:00
|
|
|
``context`` argument of ``Field.from_db_value()`` and ``Expression.convert_value()``
|
|
|
|
------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
The ``context`` argument of ``Field.from_db_value()`` and
|
|
|
|
``Expression.convert_value()`` is unused as it's always an empty dictionary.
|
|
|
|
The signature of both methods is now::
|
|
|
|
|
|
|
|
(self, value, expression, connection)
|
|
|
|
|
|
|
|
instead of::
|
|
|
|
|
|
|
|
(self, value, expression, connection, context)
|
|
|
|
|
|
|
|
Support for the old signature in custom fields and expressions remains until
|
|
|
|
Django 3.0.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
Miscellaneous
|
|
|
|
-------------
|
|
|
|
|
2017-01-25 14:23:04 +00:00
|
|
|
* The ``django.db.backends.postgresql_psycopg2`` module is deprecated in favor
|
|
|
|
of ``django.db.backends.postgresql``. It's been an alias since Django 1.9.
|
|
|
|
This only affects code that imports from the module directly. The
|
|
|
|
``DATABASES`` setting can still use
|
|
|
|
``'django.db.backends.postgresql_psycopg2'``, though you can simplify that by
|
|
|
|
using the ``'django.db.backends.postgresql'`` name added in Django 1.9.
|
2016-11-07 20:03:37 +00:00
|
|
|
|
2017-02-11 10:49:04 +00:00
|
|
|
* ``django.shortcuts.render_to_response()`` is deprecated in favor of
|
|
|
|
:func:`django.shortcuts.render`. ``render()`` takes the same arguments
|
|
|
|
except that is also requires a ``request``.
|
|
|
|
|
2017-02-16 12:59:44 +00:00
|
|
|
* The ``DEFAULT_CONTENT_TYPE`` setting is deprecated. It doesn't interact well
|
|
|
|
well with third-party apps and is obsolete since HTML5 has mostly superseded
|
|
|
|
XHTML.
|
|
|
|
|
2017-04-26 18:17:41 +00:00
|
|
|
* ``HttpRequest.xreadlines()`` is deprecated in favor of iterating over the
|
|
|
|
request.
|
|
|
|
|
2016-11-07 20:03:37 +00:00
|
|
|
.. _removed-features-2.0:
|
|
|
|
|
|
|
|
Features removed in 2.0
|
|
|
|
=======================
|
|
|
|
|
|
|
|
These features have reached the end of their deprecation cycle and are removed
|
|
|
|
in Django 2.0. See :ref:`deprecated-features-1.9` and
|
|
|
|
:ref:`deprecated-features-1.10` for details, including how to remove usage of
|
|
|
|
these features.
|
2016-11-07 14:46:42 +00:00
|
|
|
|
|
|
|
* The ``weak`` argument to ``django.dispatch.signals.Signal.disconnect()`` is
|
|
|
|
removed.
|
2016-12-31 19:11:52 +00:00
|
|
|
|
|
|
|
* ``django.db.backends.base.BaseDatabaseOperations.check_aggregate_support()``
|
|
|
|
is removed.
|
2016-11-07 21:28:13 +00:00
|
|
|
|
|
|
|
* The ``django.forms.extras`` package is removed.
|
2016-11-07 23:19:34 +00:00
|
|
|
|
|
|
|
* The ``assignment_tag`` helper is removed.
|
2016-12-16 23:13:34 +00:00
|
|
|
|
|
|
|
* The ``host`` argument to ``SimpleTestCase.assertsRedirects()`` is removed.
|
|
|
|
The compatibility layer which allows absolute URLs to be considered equal to
|
|
|
|
relative ones when the path is identical is also removed.
|
2016-12-16 23:19:52 +00:00
|
|
|
|
|
|
|
* ``Field.rel`` and ``Field.remote_field.to`` are removed.
|
2016-12-30 22:50:05 +00:00
|
|
|
|
|
|
|
* The ``on_delete`` argument for ``ForeignKey`` and ``OneToOneField`` are now
|
|
|
|
required.
|
2016-12-30 22:55:03 +00:00
|
|
|
|
|
|
|
* ``django.db.models.fields.add_lazy_relation()`` is removed.
|
2016-12-30 23:04:09 +00:00
|
|
|
|
|
|
|
* When time zone support is enabled, database backends that don't support time
|
|
|
|
zones no longer convert aware datetimes to naive values in UTC anymore when
|
|
|
|
such values are passed as parameters to SQL queries executed outside of the
|
|
|
|
ORM, e.g. with ``cursor.execute()``.
|
2016-12-30 23:10:04 +00:00
|
|
|
|
|
|
|
* ``django.contrib.auth.tests.utils.skipIfCustomUser()`` is removed.
|
2016-11-07 12:00:40 +00:00
|
|
|
|
|
|
|
* The ``GeoManager`` and ``GeoQuerySet`` classes are removed.
|
2016-12-30 23:56:34 +00:00
|
|
|
|
|
|
|
* The ``django.contrib.gis.geoip`` module is removed.
|
2016-12-31 01:09:26 +00:00
|
|
|
|
|
|
|
* The ``supports_recursion`` check for template loaders is removed from:
|
|
|
|
|
|
|
|
* ``django.template.engine.Engine.find_template()``
|
|
|
|
* ``django.template.loader_tags.ExtendsNode.find_template()``
|
|
|
|
* ``django.template.loaders.base.Loader.supports_recursion()``
|
|
|
|
* ``django.template.loaders.cached.Loader.supports_recursion()``
|
|
|
|
|
|
|
|
* The ``load_template`` and ``load_template_sources`` template loader methods
|
|
|
|
are removed.
|
|
|
|
|
|
|
|
* The ``template_dirs`` argument for template loaders is removed:
|
|
|
|
|
|
|
|
* ``django.template.loaders.base.Loader.get_template()``
|
|
|
|
* ``django.template.loaders.cached.Loader.cache_key()``
|
|
|
|
* ``django.template.loaders.cached.Loader.get_template()``
|
|
|
|
* ``django.template.loaders.cached.Loader.get_template_sources()``
|
|
|
|
* ``django.template.loaders.filesystem.Loader.get_template_sources()``
|
|
|
|
|
|
|
|
* ``django.template.loaders.base.Loader.__call__()`` is removed.
|
2016-12-31 12:05:37 +00:00
|
|
|
|
|
|
|
* Support for custom error views that don't accept an ``exception`` parameter
|
|
|
|
is removed.
|
2016-12-31 12:10:04 +00:00
|
|
|
|
|
|
|
* The ``mime_type`` attribute of ``django.utils.feedgenerator.Atom1Feed`` and
|
|
|
|
``django.utils.feedgenerator.RssFeed`` is removed.
|
2017-01-10 14:57:49 +00:00
|
|
|
|
|
|
|
* The ``app_name`` argument to ``include()`` is removed.
|
|
|
|
|
2017-02-22 23:00:53 +00:00
|
|
|
* Support for passing a 3-tuple (including ``admin.site.urls``) as the first
|
|
|
|
argument to ``include()`` is removed.
|
2017-01-10 14:57:49 +00:00
|
|
|
|
|
|
|
* Support for setting a URL instance namespace without an application namespace
|
|
|
|
is removed.
|
2016-12-31 12:36:21 +00:00
|
|
|
|
|
|
|
* ``Field._get_val_from_obj()`` is removed.
|
2016-12-31 12:41:35 +00:00
|
|
|
|
|
|
|
* ``django.template.loaders.eggs.Loader`` is removed.
|
2016-12-31 13:05:01 +00:00
|
|
|
|
|
|
|
* The ``current_app`` parameter to the ``contrib.auth`` function-based views is
|
|
|
|
removed.
|
2016-12-31 13:10:37 +00:00
|
|
|
|
|
|
|
* The ``callable_obj`` keyword argument to
|
|
|
|
``SimpleTestCase.assertRaisesMessage()`` is removed.
|
2016-12-31 13:26:23 +00:00
|
|
|
|
|
|
|
* Support for the ``allow_tags`` attribute on ``ModelAdmin`` methods is
|
|
|
|
removed.
|
2016-12-31 13:27:32 +00:00
|
|
|
|
|
|
|
* The ``enclosure`` keyword argument to ``SyndicationFeed.add_item()`` is
|
|
|
|
removed.
|
2016-12-31 13:35:39 +00:00
|
|
|
|
|
|
|
* The ``django.template.loader.LoaderOrigin`` and
|
|
|
|
``django.template.base.StringOrigin`` aliases for
|
|
|
|
``django.template.base.Origin`` are removed.
|
2016-12-31 13:52:42 +00:00
|
|
|
|
|
|
|
* The ``makemigrations --exit`` option is removed.
|
2016-12-31 14:04:09 +00:00
|
|
|
|
|
|
|
* Support for direct assignment to a reverse foreign key or many-to-many
|
|
|
|
relation is removed.
|
2016-12-31 14:33:40 +00:00
|
|
|
|
|
|
|
* The ``get_srid()`` and ``set_srid()`` methods of
|
|
|
|
``django.contrib.gis.geos.GEOSGeometry`` are removed.
|
2016-12-31 14:36:46 +00:00
|
|
|
|
|
|
|
* The ``get_x()``, ``set_x()``, ``get_y()``, ``set_y()``, ``get_z()``, and
|
|
|
|
``set_z()`` methods of ``django.contrib.gis.geos.Point`` are removed.
|
2016-12-31 14:42:27 +00:00
|
|
|
|
|
|
|
* The ``get_coords()`` and ``set_coords()`` methods of
|
|
|
|
``django.contrib.gis.geos.Point`` are removed.
|
2016-12-31 14:45:55 +00:00
|
|
|
|
|
|
|
* The ``cascaded_union`` property of ``django.contrib.gis.geos.MultiPolygon``
|
|
|
|
is removed.
|
2016-12-31 14:52:31 +00:00
|
|
|
|
|
|
|
* ``django.utils.functional.allow_lazy()`` is removed.
|
2016-12-31 14:56:26 +00:00
|
|
|
|
|
|
|
* The ``shell --plain`` option is removed.
|
2016-12-31 14:59:51 +00:00
|
|
|
|
|
|
|
* The ``django.core.urlresolvers`` module is removed.
|
2016-12-31 15:30:41 +00:00
|
|
|
|
|
|
|
* ``CommaSeparatedIntegerField`` is removed, except for support in historical
|
|
|
|
migrations.
|
2016-12-31 16:02:10 +00:00
|
|
|
|
|
|
|
* The template ``Context.has_key()`` method is removed.
|
2016-12-31 16:11:04 +00:00
|
|
|
|
|
|
|
* Support for the ``django.core.files.storage.Storage.accessed_time()``,
|
|
|
|
``created_time()``, and ``modified_time()`` methods is removed.
|
2016-12-31 16:24:40 +00:00
|
|
|
|
|
|
|
* Support for query lookups using the model name when
|
|
|
|
``Meta.default_related_name`` is set is removed.
|
2016-12-31 16:32:50 +00:00
|
|
|
|
|
|
|
* The MySQL ``__search`` lookup is removed.
|
2016-12-31 16:36:43 +00:00
|
|
|
|
|
|
|
* The shim for supporting custom related manager classes without a
|
|
|
|
``_apply_rel_filters()`` method is removed.
|
2016-12-31 16:46:40 +00:00
|
|
|
|
|
|
|
* Using ``User.is_authenticated()`` and ``User.is_anonymous()`` as methods
|
2017-02-06 12:57:11 +00:00
|
|
|
rather than properties is no longer supported.
|
2016-12-31 16:54:49 +00:00
|
|
|
|
|
|
|
* The ``Model._meta.virtual_fields`` attribute is removed.
|
|
|
|
|
|
|
|
* The keyword arguments ``virtual_only`` in ``Field.contribute_to_class()`` and
|
|
|
|
``virtual`` in ``Model._meta.add_field()`` are removed.
|
2016-12-31 17:10:37 +00:00
|
|
|
|
|
|
|
* The ``javascript_catalog()`` and ``json_catalog()`` views are removed.
|
2016-12-31 17:13:00 +00:00
|
|
|
|
|
|
|
* ``django.contrib.gis.utils.precision_wkt()`` is removed.
|
2016-12-31 17:30:29 +00:00
|
|
|
|
|
|
|
* In multi-table inheritance, implicit promotion of a ``OneToOneField`` to a
|
|
|
|
``parent_link`` is removed.
|
2016-12-31 17:34:00 +00:00
|
|
|
|
|
|
|
* Support for ``Widget._format_value()`` is removed.
|
2016-12-31 17:36:25 +00:00
|
|
|
|
|
|
|
* ``FileField`` methods ``get_directory_name()`` and ``get_filename()`` are
|
|
|
|
removed.
|
2016-12-31 17:43:30 +00:00
|
|
|
|
|
|
|
* The ``mark_for_escaping()`` function and the classes it uses: ``EscapeData``,
|
|
|
|
``EscapeBytes``, ``EscapeText``, ``EscapeString``, and ``EscapeUnicode`` are
|
|
|
|
removed.
|
|
|
|
|
|
|
|
* The ``escape`` filter now uses ``django.utils.html.conditional_escape()``.
|
2016-12-31 18:07:35 +00:00
|
|
|
|
|
|
|
* ``Manager.use_for_related_fields`` is removed.
|
|
|
|
|
|
|
|
* Model ``Manager`` inheritance follows MRO inheritance rules. The requirement
|
|
|
|
to use ``Meta.manager_inheritance_from_future`` to opt-in to the behavior is
|
|
|
|
removed.
|
2016-12-31 18:24:00 +00:00
|
|
|
|
|
|
|
* Support for old-style middleware using ``settings.MIDDLEWARE_CLASSES`` is
|
|
|
|
removed.
|