2.1.txt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  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.2.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. Serialization
  174. ~~~~~~~~~~~~~
  175. * ...
  176. Signals
  177. ~~~~~~~
  178. * ...
  179. Templates
  180. ~~~~~~~~~
  181. * The new :tfilter:`json_script` filter safely outputs a Python object as JSON,
  182. wrapped in a ``<script>`` tag, ready for use with JavaScript.
  183. Tests
  184. ~~~~~
  185. * Added test :class:`~django.test.Client` support for 307 and 308 redirects.
  186. * The test :class:`~django.test.Client` now serializes a request data
  187. dictionary as JSON if ``content_type='application/json'``. You can customize
  188. the JSON encoder with test client's ``json_encoder`` parameter.
  189. * The new :meth:`.SimpleTestCase.assertWarnsMessage` method is a simpler
  190. version of :meth:`~unittest.TestCase.assertWarnsRegex`.
  191. URLs
  192. ~~~~
  193. * ...
  194. Validators
  195. ~~~~~~~~~~
  196. * ...
  197. .. _backwards-incompatible-2.1:
  198. Backwards incompatible changes in 2.1
  199. =====================================
  200. Database backend API
  201. --------------------
  202. * To adhere to :pep:`249`, exceptions where a database doesn't support a
  203. feature are changed from :exc:`NotImplementedError` to
  204. :exc:`django.db.NotSupportedError`.
  205. * Renamed the ``allow_sliced_subqueries`` database feature flag to
  206. ``allow_sliced_subqueries_with_in``.
  207. * ``DatabaseOperations.distinct_sql()`` now requires an additional ``params``
  208. argument and returns a tuple of SQL and parameters instead of a SQL string.
  209. * ``DatabaseFeatures.introspected_boolean_field_type`` is changed from a method
  210. to a property.
  211. :mod:`django.contrib.gis`
  212. -------------------------
  213. * Support for SpatiaLite 4.0 is removed.
  214. Dropped support for MySQL 5.5
  215. -----------------------------
  216. The end of upstream support for MySQL 5.5 is December 2018. Django 2.1 supports
  217. MySQL 5.6 and higher.
  218. Dropped support for PostgreSQL 9.3
  219. ----------------------------------
  220. The end of upstream support for PostgreSQL 9.3 is September 2018. Django 2.1
  221. supports PostgreSQL 9.4 and higher.
  222. Removed ``BCryptPasswordHasher`` from the default ``PASSWORD_HASHERS`` setting
  223. ------------------------------------------------------------------------------
  224. If you used bcrypt with Django 1.4 or 1.5 (before ``BCryptSHA256PasswordHasher``
  225. was added in Django 1.6), you might have some passwords that use the
  226. ``BCryptPasswordHasher`` hasher.
  227. You can check if that's the case like this::
  228. from django.contrib.auth import get_user_model
  229. User = get_user_model()
  230. User.objects.filter(password__startswith='bcrypt$$')
  231. If you want to continue to allow those passwords to be used, you'll
  232. have to define the :setting:`PASSWORD_HASHERS` setting (if you don't already)
  233. and include ``'django.contrib.auth.hashers.BCryptPasswordHasher'``.
  234. Moved ``wrap_label`` widget template context variable
  235. -----------------------------------------------------
  236. To fix the lack of ``<label>`` when using ``RadioSelect`` and
  237. ``CheckboxSelectMultiple`` with ``MultiWidget``, the ``wrap_label`` context
  238. variable now appears as an attribute of each option. For example, in a custom
  239. ``input_option.html`` template, change ``{% if wrap_label %}`` to
  240. ``{% if widget.wrap_label %}``.
  241. ``SameSite`` cookies
  242. --------------------
  243. The cookies used for ``django.contrib.sessions``, ``django.contrib.messages``,
  244. and Django's CSRF protection now set the ``SameSite`` flag to ``Lax`` by
  245. default. Browsers that respect this flag won't send these cookies on
  246. cross-origin requests. If you rely on the old behavior, set the
  247. :setting:`SESSION_COOKIE_SAMESITE` and/or :setting:`CSRF_COOKIE_SAMESITE`
  248. setting to ``None``.
  249. Miscellaneous
  250. -------------
  251. * The minimum supported version of ``mysqlclient`` is increased from 1.3.3 to
  252. 1.3.7.
  253. * The date format of ``Set-Cookie``'s ``Expires`` directive is changed to
  254. follow :rfc:`7231#section-7.1.1.1` instead of Netscape's cookie standard.
  255. Hyphens present in dates like ``Tue, 25-Dec-2018 22:26:13 GMT`` are removed.
  256. This change should be merely cosmetic except perhaps for antiquated browsers
  257. that don't parse the new format.
  258. * ``allowed_hosts`` is now a required argument of private API
  259. ``django.utils.http.is_safe_url()``.
  260. * The ``multiple`` attribute rendered by the
  261. :class:`~django.forms.SelectMultiple` widget now uses HTML5 boolean syntax
  262. rather than XHTML's ``multiple="multiple"``.
  263. * HTML rendered by form widgets no longer includes a closing slash on void
  264. elements, e.g. ``<br>``. This is incompatible within XHTML, although some
  265. widgets already used aspects of HTML5 such as boolean attributes.
  266. * The value of :class:`~django.forms.SelectDateWidget`'s empty options is
  267. changed from 0 to an empty string, which mainly may require some adjustments
  268. in tests that compare HTML.
  269. * :meth:`.User.has_usable_password` and the
  270. :func:`~django.contrib.auth.hashers.is_password_usable` function no longer
  271. return ``False`` if the password is ``None`` or an empty string, or if the
  272. password uses a hasher that's not in the :setting:`PASSWORD_HASHERS` setting.
  273. This undocumented behavior was a regression in Django 1.6 and prevented users
  274. with such passwords from requesting a password reset. Audit your code to
  275. confirm that your usage of these APIs don't rely on the old behavior.
  276. * Since migrations are now loaded from ``.pyc`` files, you might need to delete
  277. them if you're working in a mixed Python 2 and Python 3 environment.
  278. * Using ``None`` as a :class:`~django.contrib.postgres.fields.JSONField` lookup
  279. value now matches objects that have the specified key and a null value rather
  280. than objects that don't have the key.
  281. * The admin CSS class ``field-box`` is renamed to ``fieldBox`` to prevent
  282. conflicts with the class given to model fields named "box".
  283. * ``QuerySet.raw()`` now caches its results like regular querysets. Use
  284. ``iterator()`` if you don't want caching.
  285. .. _deprecated-features-2.1:
  286. Features deprecated in 2.1
  287. ==========================
  288. Miscellaneous
  289. -------------
  290. * The ``ForceRHR`` GIS function is deprecated in favor of the new
  291. :class:`~django.contrib.gis.db.models.functions.ForcePolygonCW` function.
  292. * ``django.utils.http.cookie_date()`` is deprecated in favor of
  293. :func:`~django.utils.http.http_date`, which follows the format of the latest
  294. RFC.
  295. * ``{% load staticfiles %}`` and ``{% load admin_static %}`` are deprecated
  296. in favor of ``{% load static %}``, which works the same.
  297. * ``django.contrib.staticfiles.templatetags.static()`` is deprecated in favor
  298. of ``django.templatetags.static.static()``.
  299. * Support for :meth:`.InlineModelAdmin.has_add_permission` methods that don't
  300. accept ``obj`` as the second positional argument will be removed in Django
  301. 3.0.
  302. .. _removed-features-2.1:
  303. Features removed in 2.1
  304. =======================
  305. These features have reached the end of their deprecation cycle and are removed
  306. in Django 2.1. See :ref:`deprecated-features-1.11` for details, including how
  307. to remove usage of these features.
  308. in Django 2.1. See :ref:`deprecated-features-1.11` and for details, including
  309. how to remove usage of these features.
  310. * ``contrib.auth.views.login()``, ``logout()``, ``password_change()``,
  311. ``password_change_done()``, ``password_reset()``, ``password_reset_done()``,
  312. ``password_reset_confirm()``, and ``password_reset_complete()`` are removed.
  313. * The ``extra_context`` parameter of ``contrib.auth.views.logout_then_login()``
  314. is removed.
  315. * ``django.test.runner.setup_databases()`` is removed.
  316. * ``django.utils.translation.string_concat()`` is removed.
  317. * ``django.core.cache.backends.memcached.PyLibMCCache`` no longer supports
  318. passing ``pylibmc`` behavior settings as top-level attributes of ``OPTIONS``.
  319. * The ``host`` parameter of ``django.utils.http.is_safe_url()`` is removed.
  320. * Silencing of exceptions raised while rendering the ``{% include %}`` template
  321. tag is removed.
  322. * ``DatabaseIntrospection.get_indexes()`` is removed.
  323. * The ``authenticate()`` method of authentication backends requires ``request``
  324. as the first positional argument.
  325. * The ``django.db.models.permalink()`` decorator is removed.
  326. * The ``USE_ETAGS`` setting is removed. ``CommonMiddleware`` and
  327. ``django.utils.cache.patch_response_headers()`` no longer set ETags.
  328. * The ``Model._meta.has_auto_field`` attribute is removed.
  329. * Support for regular expression groups with ``iLmsu#`` in ``url()`` is removed.
  330. * Support for ``Widget.render()`` methods without the ``renderer`` argument
  331. is removed.