3.0.txt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. ============================================
  2. Django 3.0 release notes - UNDER DEVELOPMENT
  3. ============================================
  4. *Expected December 2019*
  5. Welcome to Django 3.0!
  6. These release notes cover the :ref:`new features <whats-new-3.0>`, as well as
  7. some :ref:`backwards incompatible changes <backwards-incompatible-3.0>` you'll
  8. want to be aware of when upgrading from Django 2.2 or earlier. We've
  9. :ref:`dropped some features<removed-features-3.0>` that have reached the end of
  10. their deprecation cycle, and we've :ref:`begun the deprecation process for
  11. some features <deprecated-features-3.0>`.
  12. See the :doc:`/howto/upgrade-version` guide if you're updating an existing
  13. project.
  14. Python compatibility
  15. ====================
  16. Django 3.0 supports Python 3.6, 3.7, and 3.8. We **highly recommend** and only
  17. officially support the latest release of each series.
  18. The Django 2.2.x series is the last to support Python 3.5.
  19. Third-party library support for older version of Django
  20. =======================================================
  21. Following the release of Django 3.0, we suggest that third-party app authors
  22. drop support for all versions of Django prior to 2.2. At that time, you should
  23. be able to run your package's tests using ``python -Wd`` so that deprecation
  24. warnings appear. After making the deprecation warning fixes, your app should be
  25. compatible with Django 3.0.
  26. .. _whats-new-3.0:
  27. What's new in Django 3.0
  28. ========================
  29. MariaDB support
  30. ---------------
  31. Django now officially supports `MariaDB <https://mariadb.org/>`_ 10.1 and
  32. higher. See :ref:`MariaDB notes <mariadb-notes>` for more details.
  33. Minor features
  34. --------------
  35. :mod:`django.contrib.admin`
  36. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  37. * Added support for the ``admin_order_field`` attribute on properties in
  38. :attr:`.ModelAdmin.list_display`.
  39. * The new :meth:`ModelAdmin.get_inlines()
  40. <django.contrib.admin.ModelAdmin.get_inlines>` method allows specifying the
  41. inlines based on the request or model instance.
  42. :mod:`django.contrib.admindocs`
  43. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  44. * ...
  45. :mod:`django.contrib.auth`
  46. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  47. * The new ``reset_url_token`` attribute in
  48. :class:`~django.contrib.auth.views.PasswordResetConfirmView` allows specifying
  49. a token parameter displayed as a component of password reset URLs.
  50. * Added :class:`~django.contrib.auth.backends.BaseBackend` class to ease
  51. customization of authentication backends.
  52. * Added :meth:`~django.contrib.auth.models.User.get_user_permissions()` method
  53. to mirror the existing
  54. :meth:`~django.contrib.auth.models.User.get_group_permissions()` method.
  55. * Added HTML ``autocomplete`` attribute to widgets of username, email, and
  56. password fields in :mod:`django.contrib.auth.forms` for better interaction
  57. with browser password managers.
  58. :mod:`django.contrib.contenttypes`
  59. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  60. * ...
  61. :mod:`django.contrib.gis`
  62. ~~~~~~~~~~~~~~~~~~~~~~~~~
  63. * Allowed MySQL spatial lookup functions to operate on real geometries.
  64. Previous support was limited to bounding boxes.
  65. * Added the :class:`~django.contrib.gis.db.models.functions.GeometryDistance`
  66. function, supported on PostGIS.
  67. * Added support for the ``furlong`` unit in
  68. :class:`~django.contrib.gis.measure.Distance`.
  69. :mod:`django.contrib.messages`
  70. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  71. * ...
  72. :mod:`django.contrib.postgres`
  73. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  74. * ...
  75. :mod:`django.contrib.redirects`
  76. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  77. * ...
  78. :mod:`django.contrib.sessions`
  79. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  80. * The new
  81. :meth:`~django.contrib.sessions.backends.base.SessionBase.get_session_cookie_age()`
  82. methods allows dynamically specifying the session cookie age.
  83. :mod:`django.contrib.sitemaps`
  84. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  85. * ...
  86. :mod:`django.contrib.sites`
  87. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  88. * ...
  89. :mod:`django.contrib.staticfiles`
  90. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  91. * ...
  92. :mod:`django.contrib.syndication`
  93. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  94. * Added the ``language`` class attribute to the
  95. :class:`django.contrib.syndication.views.Feed` to customize a feed language.
  96. The default value is :func:`~django.utils.translation.get_language()` instead
  97. of :setting:`LANGUAGE_CODE`.
  98. Cache
  99. ~~~~~
  100. * ...
  101. CSRF
  102. ~~~~
  103. * ...
  104. Email
  105. ~~~~~
  106. * ...
  107. File Storage
  108. ~~~~~~~~~~~~
  109. * ...
  110. File Uploads
  111. ~~~~~~~~~~~~
  112. * ...
  113. Forms
  114. ~~~~~
  115. * Formsets may control the widget used when ordering forms via
  116. :attr:`~django.forms.formsets.BaseFormSet.can_order` by setting the
  117. :attr:`~django.forms.formsets.BaseFormSet.ordering_widget` attribute or
  118. overriding :attr:`~django.forms.formsets.BaseFormSet.get_ordering_widget()`.
  119. Generic Views
  120. ~~~~~~~~~~~~~
  121. * ...
  122. Internationalization
  123. ~~~~~~~~~~~~~~~~~~~~
  124. * Added the :setting:`LANGUAGE_COOKIE_HTTPONLY`,
  125. :setting:`LANGUAGE_COOKIE_SAMESITE`, and :setting:`LANGUAGE_COOKIE_SECURE`
  126. settings to set the ``HttpOnly``, ``SameSite``, and ``Secure`` flags on
  127. language cookies. The default values of these settings preserve the previous
  128. behavior.
  129. Management Commands
  130. ~~~~~~~~~~~~~~~~~~~
  131. * The new :option:`compilemessages --ignore` option allows ignoring specific
  132. directories when searching for ``.po`` files to compile.
  133. * :option:`showmigrations --list` now shows the applied datetimes when
  134. ``--verbosity`` is 2 and above.
  135. * On PostgreSQL, :djadmin:`dbshell` now supports client-side TLS certificates.
  136. * :djadmin:`inspectdb` now introspects :class:`~django.db.models.OneToOneField`
  137. when a foreign key has a unique or primary key constraint.
  138. * The new :option:`--skip-checks` option skips running system checks prior to
  139. running the command.
  140. Migrations
  141. ~~~~~~~~~~
  142. * ...
  143. Models
  144. ~~~~~~
  145. * Added hash database functions :class:`~django.db.models.functions.MD5`,
  146. :class:`~django.db.models.functions.SHA1`,
  147. :class:`~django.db.models.functions.SHA224`,
  148. :class:`~django.db.models.functions.SHA256`,
  149. :class:`~django.db.models.functions.SHA384`, and
  150. :class:`~django.db.models.functions.SHA512`.
  151. * Added the :class:`~django.db.models.functions.Sign` database function.
  152. * The new ``is_dst`` parameter of the
  153. :class:`~django.db.models.functions.Trunc` database functions determines the
  154. treatment of nonexistent and ambiguous datetimes.
  155. * ``connection.queries`` now shows ``COPY … TO`` statements on PostgreSQL.
  156. * :class:`~django.db.models.FilePathField` now accepts a callable ``path``.
  157. Requests and Responses
  158. ~~~~~~~~~~~~~~~~~~~~~~
  159. * Allowed :class:`~django.http.HttpResponse` to be initialized with
  160. :class:`memoryview` content.
  161. * For use in, for example, Django templates, :attr:`.HttpRequest.headers` now
  162. allows look ups using underscores (e.g. ``user_agent``) in place of hyphens.
  163. Serialization
  164. ~~~~~~~~~~~~~
  165. * ...
  166. Signals
  167. ~~~~~~~
  168. * ...
  169. Templates
  170. ~~~~~~~~~
  171. * ...
  172. Tests
  173. ~~~~~
  174. * The new test :class:`~django.test.Client` argument
  175. ``raise_request_exception`` allows controlling whether or not exceptions
  176. raised during the request should also be raised in the test. The value
  177. defaults to ``True`` for backwards compatibility. If it is ``False`` and an
  178. exception occurs, the test client will return a 500 response with the
  179. attribute :attr:`~django.test.Response.exc_info`, a tuple providing
  180. information of the exception that occurred.
  181. * Tests and test cases to run can be selected by test name pattern using the
  182. new :option:`test -k` option.
  183. * HTML comparison, as used by
  184. :meth:`~django.test.SimpleTestCase.assertHTMLEqual`, now treats text, character
  185. references, and entity references that refer to the same character as
  186. equivalent.
  187. * Django test runner now supports headless mode for selenium tests on supported
  188. browsers. Add the ``--headless`` option to enable this mode.
  189. * Django test runner now supports ``--start-at`` and ``--start-after`` options
  190. to run tests starting from a specific top-level module.
  191. URLs
  192. ~~~~
  193. * ...
  194. Validators
  195. ~~~~~~~~~~
  196. * ...
  197. .. _backwards-incompatible-3.0:
  198. Backwards incompatible changes in 3.0
  199. =====================================
  200. Database backend API
  201. --------------------
  202. This section describes changes that may be needed in third-party database
  203. backends.
  204. * The second argument of ``DatabaseIntrospection.get_geometry_type()`` is now
  205. the row description instead of the column name.
  206. * ``DatabaseIntrospection.get_field_type()`` may no longer return tuples.
  207. * If the database can create foreign keys in the same SQL statement that adds a
  208. field, add ``SchemaEditor.sql_create_column_inline_fk`` with the appropriate
  209. SQL; otherwise, set ``DatabaseFeatures.can_create_inline_fk = False``.
  210. * ``DatabaseFeatures.can_return_id_from_insert`` and
  211. ``can_return_ids_from_bulk_insert`` are renamed to
  212. ``can_return_columns_from_insert`` and ``can_return_rows_from_bulk_insert``.
  213. :mod:`django.contrib.gis`
  214. -------------------------
  215. * Support for PostGIS 2.1 is removed.
  216. * Support for SpatiaLite 4.1 and 4.2 is removed.
  217. * Support for GDAL 1.11 and GEOS 3.4 is removed.
  218. Dropped support for PostgreSQL 9.4
  219. ----------------------------------
  220. Upstream support for PostgreSQL 9.4 ends in December 2019. Django 3.0 supports
  221. PostgreSQL 9.5 and higher.
  222. Dropped support for Oracle 12.1
  223. -------------------------------
  224. Upstream support for Oracle 12.1 ends in July 2021. Django 2.2 will be
  225. supported until April 2022. Django 3.0 officially supports Oracle 12.2 and 18c.
  226. Removed private Python 2 compatibility APIs
  227. -------------------------------------------
  228. While Python 2 support was removed in Django 2.0, some private APIs weren't
  229. removed from Django so that third party apps could continue using them until
  230. the Python 2 end-of-life.
  231. Since we expect apps to drop Python 2 compatibility when adding support for
  232. Django 3.0, we're removing these APIs at this time.
  233. * ``django.test.utils.str_prefix()`` - Strings don't have 'u' prefixes in
  234. Python 3.
  235. * ``django.test.utils.patch_logger()`` - Use
  236. :meth:`unittest.TestCase.assertLogs` instead.
  237. * ``django.utils.lru_cache.lru_cache()`` - Alias of
  238. :func:`functools.lru_cache`.
  239. * ``django.utils.decorators.available_attrs()`` - This function returns
  240. ``functools.WRAPPER_ASSIGNMENTS``.
  241. * ``django.utils.decorators.ContextDecorator`` - Alias of
  242. :class:`contextlib.ContextDecorator`.
  243. * ``django.utils._os.abspathu()`` - Alias of :func:`os.path.abspath`.
  244. * ``django.utils._os.upath()`` and ``npath()`` - These functions do nothing on
  245. Python 3.
  246. * ``django.utils.six`` - Remove usage of this vendored library or switch to
  247. `six <https://pypi.org/project/six/>`_.
  248. * ``django.utils.encoding.python_2_unicode_compatible()`` - Alias of
  249. ``six.python_2_unicode_compatible()``.
  250. * ``django.utils.functional.curry()`` - Use :func:`functools.partial` or
  251. :class:`functools.partialmethod`. See :commit:`5b1c389603a353625ae1603`.
  252. * ``django.utils.safestring.SafeBytes`` - Unused since Django 2.0.
  253. New default value for the ``FILE_UPLOAD_PERMISSIONS`` setting
  254. -------------------------------------------------------------
  255. In older versions, the :setting:`FILE_UPLOAD_PERMISSIONS` setting defaults to
  256. ``None``. With the default :setting:`FILE_UPLOAD_HANDLERS`, this results in
  257. uploaded files having different permissions depending on their size and which
  258. upload handler is used.
  259. ``FILE_UPLOAD_PERMISSION`` now defaults to ``0o644`` to avoid this
  260. inconsistency.
  261. Miscellaneous
  262. -------------
  263. * ``ContentType.__str__()`` now includes the model's ``app_label`` to
  264. disambiguate model's with the same name in different apps.
  265. * Because accessing the language in the session rather than in the cookie is
  266. deprecated, ``LocaleMiddleware`` no longer looks for the user's language in
  267. the session and :func:`django.contrib.auth.logout` no longer preserves the
  268. session's language after logout.
  269. * :func:`django.utils.html.escape` now uses :func:`html.escape` to escape HTML.
  270. This converts ``'`` to ``&#x27;`` instead of the previous equivalent decimal
  271. code ``&#39;``.
  272. * The ``django-admin test -k`` option now works as the :option:`unittest
  273. -k<unittest.-k>` option rather than as a shortcut for ``--keepdb``.
  274. * Support for ``pywatchman`` < 1.2.0 is removed.
  275. * HTML rendered by :class:`~django.forms.SelectDateWidget` for required fields
  276. now have the ``placeholder`` attribute, which mainly may require some
  277. adjustments in tests that compare HTML.
  278. * :func:`~django.utils.http.urlencode` now encodes iterable values as they are
  279. when ``doseq=False``, rather than iterating them, bringing it into line with
  280. the standard library :func:`urllib.parse.urlencode` function.
  281. .. _deprecated-features-3.0:
  282. Features deprecated in 3.0
  283. ==========================
  284. ``django.utils.encoding.force_text()`` and ``smart_text()``
  285. -----------------------------------------------------------
  286. The ``smart_text()`` and ``force_text()`` aliases (since Django 2.0) of
  287. ``smart_str()`` and ``force_str()`` are deprecated. Ignore this deprecation if
  288. your code supports Python 2 as the behavior of ``smart_str()`` and
  289. ``force_str()`` is different there.
  290. Miscellaneous
  291. -------------
  292. * ``django.utils.http.urlquote()``, ``urlquote_plus()``, ``urlunquote()``, and
  293. ``urlunquote_plus()`` are deprecated in favor of the functions that they're
  294. aliases for: :func:`urllib.parse.quote`, :func:`~urllib.parse.quote_plus`,
  295. :func:`~urllib.parse.unquote`, and :func:`~urllib.parse.unquote_plus`.
  296. * ``django.utils.translation.ugettext()``, ``ugettext_lazy()``,
  297. ``ugettext_noop()``, ``ungettext()``, and ``ungettext_lazy()`` are deprecated
  298. in favor of the functions that they're aliases for:
  299. :func:`django.utils.translation.gettext`,
  300. :func:`~django.utils.translation.gettext_lazy`,
  301. :func:`~django.utils.translation.gettext_noop`,
  302. :func:`~django.utils.translation.ngettext`, and
  303. :func:`~django.utils.translation.ngettext_lazy`.
  304. * To limit creation of sessions and hence favor some caching strategies,
  305. :func:`django.views.i18n.set_language` will stop setting the user's language
  306. in the session in Django 4.0. Since Django 2.1, the language is always stored
  307. in the :setting:`LANGUAGE_COOKIE_NAME` cookie.
  308. * ``alias=None`` is added to the signature of
  309. :meth:`.Expression.get_group_by_cols`.
  310. * ``django.utils.text.unescape_entities()`` is deprecated in favor of
  311. :func:`html.unescape`. Note that unlike ``unescape_entities()``,
  312. ``html.unescape()`` evaluates lazy strings immediately.
  313. .. _removed-features-3.0:
  314. Features removed in 3.0
  315. =======================
  316. These features have reached the end of their deprecation cycle and are removed
  317. in Django 3.0.
  318. See :ref:`deprecated-features-2.0` for details on these changes, including how
  319. to remove usage of these features.
  320. * The ``django.db.backends.postgresql_psycopg2`` module is removed.
  321. * ``django.shortcuts.render_to_response()`` is removed.
  322. * The ``DEFAULT_CONTENT_TYPE`` setting is removed.
  323. * ``HttpRequest.xreadlines()`` is removed.
  324. * Support for the ``context`` argument of ``Field.from_db_value()`` and
  325. ``Expression.convert_value()`` is removed.
  326. * The ``field_name`` keyword argument of ``QuerySet.earliest()`` and
  327. ``latest()`` is removed.
  328. See :ref:`deprecated-features-2.1` for details on these changes, including how
  329. to remove usage of these features.
  330. * The ``ForceRHR`` GIS function is removed.
  331. * ``django.utils.http.cookie_date()`` is removed.
  332. * The ``staticfiles`` and ``admin_static`` template tag libraries are removed.
  333. * ``django.contrib.staticfiles.templatetags.staticfiles.static()`` is removed.