2.1.txt 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. ============================================
  2. Django 2.1 release notes - UNDER DEVELOPMENT
  3. ============================================
  4. Welcome to Django 2.1!
  5. These release notes cover the :ref:`new features <whats-new-2.1>`, as well as
  6. some :ref:`backwards incompatible changes <backwards-incompatible-2.1>` you'll
  7. want to be aware of when upgrading from Django 2.0 or earlier. We've
  8. :ref:`dropped some features<removed-features-2.1>` that have reached the end of
  9. their deprecation cycle, and we've :ref:`begun the deprecation process for some
  10. features <deprecated-features-2.1>`.
  11. See the :doc:`/howto/upgrade-version` guide if you're updating an existing
  12. project.
  13. Python compatibility
  14. ====================
  15. Django 2.1 supports Python 3.5, 3.6, and 3.7. Django 2.0 is the last version to
  16. support Python 3.4. We **highly recommend** and only officially support the
  17. latest release of each series.
  18. .. _whats-new-2.1:
  19. What's new in Django 2.1
  20. ========================
  21. Minor features
  22. --------------
  23. :mod:`django.contrib.admin`
  24. ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  25. * :attr:`.ModelAdmin.search_fields` now accepts any lookup such as
  26. ``field__exact``.
  27. * jQuery is upgraded from version 2.2.3 to 3.3.1.
  28. * The new :meth:`.ModelAdmin.delete_queryset` method allows customizing the
  29. deletion process of the "delete selected objects" action.
  30. * You can now :ref:`override the the default admin site
  31. <overriding-default-admin-site>`.
  32. * The new :attr:`.ModelAdmin.sortable_by` attribute and
  33. :meth:`.ModelAdmin.get_sortable_by` method allow limiting the columns that
  34. can be sorted in the change list page.
  35. * The ``admin_order_field`` attribute for elements in
  36. :attr:`.ModelAdmin.list_display` may now be a query expression.
  37. * The new :meth:`.ModelAdmin.get_deleted_objects()` method allows customizing
  38. the deletion process of the delete view and the "delete selected" action.
  39. * The ``actions.html``, ``change_list_results.html``, ``date_hierarchy.html``,
  40. ``pagination.html``, ``prepopulated_fields_js.html``, ``search_form.html``,
  41. and ``submit_line.html`` templates can now be :ref:`overridden per app or
  42. per model <admin-templates-overridden-per-app-or-model>` (besides overridden
  43. globally).
  44. * The admin change list and change form object tools can now be :ref:`overridden
  45. per app, per model, or globally <admin-templates-overridden-per-app-or-model>`
  46. with ``change_list_object_tools.html`` and
  47. ``change_form_object_tools.html`` templates.
  48. * :meth:`.InlineModelAdmin.has_add_permission` is now passed the parent object
  49. as the second positional argument, ``obj``.
  50. :mod:`django.contrib.admindocs`
  51. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  52. * ...
  53. :mod:`django.contrib.auth`
  54. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  55. * :djadmin:`createsuperuser` now gives a prompt to allow bypassing the
  56. :setting:`AUTH_PASSWORD_VALIDATORS` checks.
  57. * :class:`~django.contrib.auth.forms.UserCreationForm` and
  58. :class:`~django.contrib.auth.forms.UserChangeForm` no longer need to be
  59. rewritten for a custom user model.
  60. :mod:`django.contrib.contenttypes`
  61. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  62. * ...
  63. :mod:`django.contrib.gis`
  64. ~~~~~~~~~~~~~~~~~~~~~~~~~
  65. * The new :meth:`.GEOSGeometry.buffer_with_style` method is a version of
  66. :meth:`~.GEOSGeometry.buffer` that allows customizing the style of the
  67. buffer.
  68. * :class:`~django.contrib.gis.forms.widgets.OpenLayersWidget` is now based on
  69. OpenLayers 4.6.5 (previously 3.20.1).
  70. :mod:`django.contrib.messages`
  71. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  72. * ...
  73. :mod:`django.contrib.postgres`
  74. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  75. * ...
  76. :mod:`django.contrib.redirects`
  77. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  78. * ...
  79. :mod:`django.contrib.sessions`
  80. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  81. * Added the :setting:`SESSION_COOKIE_SAMESITE` setting to set the ``SameSite``
  82. cookie flag on session cookies.
  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. * ...
  95. Cache
  96. ~~~~~
  97. * The :ref:`local-memory cache backend <local-memory-caching>` now uses a
  98. least-recently-used (LRU) culling strategy rather than a pseudo-random one.
  99. * The new ``touch()`` method of the :ref:`low-level cache API
  100. <low-level-cache-api>` updates the timeout of cache keys.
  101. CSRF
  102. ~~~~
  103. * Added the :setting:`CSRF_COOKIE_SAMESITE` setting to set the ``SameSite``
  104. cookie flag on CSRF cookies.
  105. Database backends
  106. ~~~~~~~~~~~~~~~~~
  107. * ...
  108. Email
  109. ~~~~~
  110. * ...
  111. File Storage
  112. ~~~~~~~~~~~~
  113. * ...
  114. File Uploads
  115. ~~~~~~~~~~~~
  116. * ...
  117. Forms
  118. ~~~~~
  119. * The widget for ``ImageField`` now renders with the HTML attribute
  120. ``accept="image/*"``.
  121. Generic Views
  122. ~~~~~~~~~~~~~
  123. * ...
  124. Internationalization
  125. ~~~~~~~~~~~~~~~~~~~~
  126. * Added the :meth:`~django.utils.translation.get_supported_language_variant`
  127. function.
  128. * Untranslated strings for territorial language variants now use the
  129. translations of the generic language. For example, untranslated ``pt_BR``
  130. strings use ``pt`` translations.
  131. Management Commands
  132. ~~~~~~~~~~~~~~~~~~~
  133. * The new :option:`inspectdb --include-views` option allows creating models
  134. for database views.
  135. Migrations
  136. ~~~~~~~~~~
  137. * Added support for serialization of ``functools.partialmethod`` objects.
  138. * To support frozen environments, migrations may be loaded from ``.pyc`` files.
  139. Models
  140. ~~~~~~
  141. * Models can now use ``__init_subclass__()`` from :pep:`487`.
  142. * A ``BinaryField`` may now be set to ``editable=True`` if you wish to include
  143. it in model forms.
  144. * A number of new text database functions are added:
  145. :class:`~django.db.models.functions.Chr`,
  146. :class:`~django.db.models.functions.Left`,
  147. :class:`~django.db.models.functions.LPad`,
  148. :class:`~django.db.models.functions.LTrim`,
  149. :class:`~django.db.models.functions.Ord`,
  150. :class:`~django.db.models.functions.Repeat`,
  151. :class:`~django.db.models.functions.Replace`,
  152. :class:`~django.db.models.functions.Right`,
  153. :class:`~django.db.models.functions.RPad`,
  154. :class:`~django.db.models.functions.RTrim`, and
  155. :class:`~django.db.models.functions.Trim`.
  156. * The new :class:`~django.db.models.functions.TruncWeek` function truncates
  157. :class:`~django.db.models.DateField` and
  158. :class:`~django.db.models.DateTimeField` to the Monday of a week.
  159. * Query expressions can now be negated using a minus sign.
  160. * :meth:`.QuerySet.order_by` and :meth:`distinct(*fields) <.QuerySet.distinct>`
  161. now support using field transforms.
  162. * :class:`~django.db.models.BooleanField` can now be ``null=True``. This is
  163. encouraged instead of :class:`~django.db.models.NullBooleanField`, which will
  164. likely be deprecated in the future.
  165. * The new :meth:`.QuerySet.explain` method displays the database's execution
  166. plan of a queryset's query.
  167. * :meth:`.QuerySet.raw` now supports :meth:`~.QuerySet.prefetch_related`.
  168. Requests and Responses
  169. ~~~~~~~~~~~~~~~~~~~~~~
  170. * Added :meth:`.HttpRequest.get_full_path_info`.
  171. * Added the ``samesite`` argument to :meth:`.HttpResponse.set_cookie` to allow
  172. setting the ``SameSite`` cookie flag.
  173. * The new ``as_attachment`` argument for :class:`~django.http.FileResponse`
  174. sets the ``Content-Disposition`` header to make the browser ask if the user
  175. wants to download the file. ``FileResponse`` also tries to set the
  176. ``Content-Type`` and ``Content-Length`` headers where appropriate.
  177. Serialization
  178. ~~~~~~~~~~~~~
  179. * ...
  180. Signals
  181. ~~~~~~~
  182. * ...
  183. Templates
  184. ~~~~~~~~~
  185. * The new :tfilter:`json_script` filter safely outputs a Python object as JSON,
  186. wrapped in a ``<script>`` tag, ready for use with JavaScript.
  187. Tests
  188. ~~~~~
  189. * Added test :class:`~django.test.Client` support for 307 and 308 redirects.
  190. * The test :class:`~django.test.Client` now serializes a request data
  191. dictionary as JSON if ``content_type='application/json'``. You can customize
  192. the JSON encoder with test client's ``json_encoder`` parameter.
  193. * The new :meth:`.SimpleTestCase.assertWarnsMessage` method is a simpler
  194. version of :meth:`~unittest.TestCase.assertWarnsRegex`.
  195. URLs
  196. ~~~~
  197. * ...
  198. Validators
  199. ~~~~~~~~~~
  200. * ...
  201. .. _backwards-incompatible-2.1:
  202. Backwards incompatible changes in 2.1
  203. =====================================
  204. Database backend API
  205. --------------------
  206. * To adhere to :pep:`249`, exceptions where a database doesn't support a
  207. feature are changed from :exc:`NotImplementedError` to
  208. :exc:`django.db.NotSupportedError`.
  209. * Renamed the ``allow_sliced_subqueries`` database feature flag to
  210. ``allow_sliced_subqueries_with_in``.
  211. * ``DatabaseOperations.distinct_sql()`` now requires an additional ``params``
  212. argument and returns a tuple of SQL and parameters instead of a SQL string.
  213. * ``DatabaseFeatures.introspected_boolean_field_type`` is changed from a method
  214. to a property.
  215. :mod:`django.contrib.gis`
  216. -------------------------
  217. * Support for SpatiaLite 4.0 is removed.
  218. Dropped support for MySQL 5.5
  219. -----------------------------
  220. The end of upstream support for MySQL 5.5 is December 2018. Django 2.1 supports
  221. MySQL 5.6 and higher.
  222. Dropped support for PostgreSQL 9.3
  223. ----------------------------------
  224. The end of upstream support for PostgreSQL 9.3 is September 2018. Django 2.1
  225. supports PostgreSQL 9.4 and higher.
  226. Removed ``BCryptPasswordHasher`` from the default ``PASSWORD_HASHERS`` setting
  227. ------------------------------------------------------------------------------
  228. If you used bcrypt with Django 1.4 or 1.5 (before ``BCryptSHA256PasswordHasher``
  229. was added in Django 1.6), you might have some passwords that use the
  230. ``BCryptPasswordHasher`` hasher.
  231. You can check if that's the case like this::
  232. from django.contrib.auth import get_user_model
  233. User = get_user_model()
  234. User.objects.filter(password__startswith='bcrypt$$')
  235. If you want to continue to allow those passwords to be used, you'll
  236. have to define the :setting:`PASSWORD_HASHERS` setting (if you don't already)
  237. and include ``'django.contrib.auth.hashers.BCryptPasswordHasher'``.
  238. Moved ``wrap_label`` widget template context variable
  239. -----------------------------------------------------
  240. To fix the lack of ``<label>`` when using ``RadioSelect`` and
  241. ``CheckboxSelectMultiple`` with ``MultiWidget``, the ``wrap_label`` context
  242. variable now appears as an attribute of each option. For example, in a custom
  243. ``input_option.html`` template, change ``{% if wrap_label %}`` to
  244. ``{% if widget.wrap_label %}``.
  245. ``SameSite`` cookies
  246. --------------------
  247. The cookies used for ``django.contrib.sessions``, ``django.contrib.messages``,
  248. and Django's CSRF protection now set the ``SameSite`` flag to ``Lax`` by
  249. default. Browsers that respect this flag won't send these cookies on
  250. cross-origin requests. If you rely on the old behavior, set the
  251. :setting:`SESSION_COOKIE_SAMESITE` and/or :setting:`CSRF_COOKIE_SAMESITE`
  252. setting to ``None``.
  253. Miscellaneous
  254. -------------
  255. * The minimum supported version of ``mysqlclient`` is increased from 1.3.3 to
  256. 1.3.7.
  257. * The date format of ``Set-Cookie``'s ``Expires`` directive is changed to
  258. follow :rfc:`7231#section-7.1.1.1` instead of Netscape's cookie standard.
  259. Hyphens present in dates like ``Tue, 25-Dec-2018 22:26:13 GMT`` are removed.
  260. This change should be merely cosmetic except perhaps for antiquated browsers
  261. that don't parse the new format.
  262. * ``allowed_hosts`` is now a required argument of private API
  263. ``django.utils.http.is_safe_url()``.
  264. * The ``multiple`` attribute rendered by the
  265. :class:`~django.forms.SelectMultiple` widget now uses HTML5 boolean syntax
  266. rather than XHTML's ``multiple="multiple"``.
  267. * HTML rendered by form widgets no longer includes a closing slash on void
  268. elements, e.g. ``<br>``. This is incompatible within XHTML, although some
  269. widgets already used aspects of HTML5 such as boolean attributes.
  270. * The value of :class:`~django.forms.SelectDateWidget`'s empty options is
  271. changed from 0 to an empty string, which mainly may require some adjustments
  272. in tests that compare HTML.
  273. * :meth:`.User.has_usable_password` and the
  274. :func:`~django.contrib.auth.hashers.is_password_usable` function no longer
  275. return ``False`` if the password is ``None`` or an empty string, or if the
  276. password uses a hasher that's not in the :setting:`PASSWORD_HASHERS` setting.
  277. This undocumented behavior was a regression in Django 1.6 and prevented users
  278. with such passwords from requesting a password reset. Audit your code to
  279. confirm that your usage of these APIs don't rely on the old behavior.
  280. * Since migrations are now loaded from ``.pyc`` files, you might need to delete
  281. them if you're working in a mixed Python 2 and Python 3 environment.
  282. * Using ``None`` as a :class:`~django.contrib.postgres.fields.JSONField` lookup
  283. value now matches objects that have the specified key and a null value rather
  284. than objects that don't have the key.
  285. * The admin CSS class ``field-box`` is renamed to ``fieldBox`` to prevent
  286. conflicts with the class given to model fields named "box".
  287. * ``QuerySet.raw()`` now caches its results like regular querysets. Use
  288. ``iterator()`` if you don't want caching.
  289. * The database router :meth:`allow_relation` method is called in more cases.
  290. Improperly written routers may need to be updated accordingly.
  291. * Translations are no longer deactivated before running management commands.
  292. If your custom command requires translations to be deactivated (for example,
  293. to insert untranslated content into the database), use the new
  294. :ref:`@no_translations decorator <management-commands-and-locales>`.
  295. * Management commands no longer allow the abbreviated forms of the
  296. ``--settings`` and ``--pythonpath`` arguments.
  297. .. _deprecated-features-2.1:
  298. Features deprecated in 2.1
  299. ==========================
  300. Miscellaneous
  301. -------------
  302. * The ``ForceRHR`` GIS function is deprecated in favor of the new
  303. :class:`~django.contrib.gis.db.models.functions.ForcePolygonCW` function.
  304. * ``django.utils.http.cookie_date()`` is deprecated in favor of
  305. :func:`~django.utils.http.http_date`, which follows the format of the latest
  306. RFC.
  307. * ``{% load staticfiles %}`` and ``{% load admin_static %}`` are deprecated
  308. in favor of ``{% load static %}``, which works the same.
  309. * ``django.contrib.staticfiles.templatetags.static()`` is deprecated in favor
  310. of ``django.templatetags.static.static()``.
  311. * Support for :meth:`.InlineModelAdmin.has_add_permission` methods that don't
  312. accept ``obj`` as the second positional argument will be removed in Django
  313. 3.0.
  314. .. _removed-features-2.1:
  315. Features removed in 2.1
  316. =======================
  317. These features have reached the end of their deprecation cycle and are removed
  318. in Django 2.1. See :ref:`deprecated-features-1.11` for details, including how
  319. to remove usage of these features.
  320. in Django 2.1. See :ref:`deprecated-features-1.11` and for details, including
  321. how to remove usage of these features.
  322. * ``contrib.auth.views.login()``, ``logout()``, ``password_change()``,
  323. ``password_change_done()``, ``password_reset()``, ``password_reset_done()``,
  324. ``password_reset_confirm()``, and ``password_reset_complete()`` are removed.
  325. * The ``extra_context`` parameter of ``contrib.auth.views.logout_then_login()``
  326. is removed.
  327. * ``django.test.runner.setup_databases()`` is removed.
  328. * ``django.utils.translation.string_concat()`` is removed.
  329. * ``django.core.cache.backends.memcached.PyLibMCCache`` no longer supports
  330. passing ``pylibmc`` behavior settings as top-level attributes of ``OPTIONS``.
  331. * The ``host`` parameter of ``django.utils.http.is_safe_url()`` is removed.
  332. * Silencing of exceptions raised while rendering the ``{% include %}`` template
  333. tag is removed.
  334. * ``DatabaseIntrospection.get_indexes()`` is removed.
  335. * The ``authenticate()`` method of authentication backends requires ``request``
  336. as the first positional argument.
  337. * The ``django.db.models.permalink()`` decorator is removed.
  338. * The ``USE_ETAGS`` setting is removed. ``CommonMiddleware`` and
  339. ``django.utils.cache.patch_response_headers()`` no longer set ETags.
  340. * The ``Model._meta.has_auto_field`` attribute is removed.
  341. * Support for regular expression groups with ``iLmsu#`` in ``url()`` is removed.
  342. * Support for ``Widget.render()`` methods without the ``renderer`` argument
  343. is removed.