Django 2.1 リリースノート¶
2018年8月1日
Django 2.1 へようこそ!
このリリースノートでは、 バージョン 2.1 の新機能 と、Django 2.0 以前からアップグレードする際に注意すべき、 後方互換性のない変更 について説明します。 非推奨サイクルが終了した機能を廃止しました 。また、 一部の機能を非推奨 としました。
既存のプロジェクトをアップデートするときは、 Django の新しいバージョンへの更新 ガイドに従ってください。
Python バージョン間の互換性¶
Django 2.1 の動作には Python 3.5、3.6 または 3.7 のいずれかが必要です。Python 3.4 をサポートするのは、Django 2.0 が最後のバージョンです。各バージョン系列の最終リリースの Python を使用することを 強く推奨 します。公式には最終リリースしかサポートしません。
Django 2.1 で新しくなったこと¶
モデル "view" のパーミッション¶
"view" パーミッションが Meta.default_permissions に追加されました。新しいパーミッションは migrate 実行時に自動的に作成されます。
This allows giving users read-only access to models in the admin.
ModelAdmin.has_view_permission() is new. The implementation is backwards
compatible in that there isn't a need to assign the "view" permission to allow
users who have the "change" permission to edit objects.
There are a couple of backwards incompatible considerations.
マイナーな機能¶
django.contrib.admin¶
- ModelAdmin.search_fieldsnow accepts any lookup such as- field__exact.
- jQuery のバージョンが 2.2.3 から 3.3.1 にアップグレードされました。 
- The new - ModelAdmin.delete_queryset()method allows customizing the deletion process of the "delete selected objects" action.
- You can now override the default admin site. 
- The new - ModelAdmin.sortable_byattribute and- ModelAdmin.get_sortable_by()method allow limiting the columns that can be sorted in the change list page.
- The - admin_order_fieldattribute for elements in- ModelAdmin.list_displaymay now be a query expression.
- The new - ModelAdmin.get_deleted_objects()method allows customizing the deletion process of the delete view and the "delete selected" action.
- The - actions.html,- change_list_results.html,- date_hierarchy.html,- pagination.html,- prepopulated_fields_js.html,- search_form.html, and- submit_line.htmltemplates can now be overridden per app or per model (besides overridden globally).
- The admin change list and change form object tools can now be overridden per app, per model, or globally with - change_list_object_tools.htmland- change_form_object_tools.htmltemplates.
- InlineModelAdmin.has_add_permission()is now passed the parent object as the second positional argument,- obj.
- Admin actions may now specify permissions to limit their availability to certain users. 
django.contrib.auth¶
- createsuperusernow gives a prompt to allow bypassing the- AUTH_PASSWORD_VALIDATORSchecks.
django.contrib.gis¶
- The new - GEOSGeometry.buffer_with_style()method is a version of- buffer()that allows customizing the style of the buffer.
- OpenLayersWidgetis now based on OpenLayers 4.6.5 (previously 3.20.1).
django.contrib.sessions¶
- Added the - SESSION_COOKIE_SAMESITEsetting to set the- SameSitecookie flag on session cookies.
キャッシュ¶
- The local-memory cache backend now uses a least-recently-used (LRU) culling strategy rather than a pseudo-random one. 
- 新しい - touch()メソッドは、低レベルキャッシュ API のキャッシュキーのタイムアウトを更新します。
CSRF¶
- Added the - CSRF_COOKIE_SAMESITEsetting to set the- SameSitecookie flag on CSRF cookies.
フォーム¶
- The widget for - ImageFieldnow renders with the HTML attribute- accept="image/*".
国際化 (internationalization)¶
- Added the - get_supported_language_variant()function.
- Untranslated strings for territorial language variants now use the translations of the generic language. For example, untranslated - pt_BRstrings use- pttranslations.
管理コマンド¶
- The new - inspectdb --include-viewsoption allows creating models for database views.
- The - BaseCommandclass now uses a custom help formatter so that the standard options like- --verbosityor- --settingsappear last in the help output, giving a more prominent position to subclassed command's options.
マイグレーション¶
- Added support for serialization of - functools.partialmethodobjects.
- To support frozen environments, migrations may be loaded from - .pycfiles.
モデル¶
- Models can now use - __init_subclass__()from PEP 487.
- A - BinaryFieldmay now be set to- editable=Trueif you wish to include it in model forms.
- A number of new text database functions are added: - Chr,- Left,- LPad,- LTrim,- Ord,- Repeat,- Replace,- Right,- RPad,- RTrim, and- Trim.
- The new - TruncWeekfunction truncates- DateFieldand- DateTimeFieldto the Monday of a week.
- Query expressions can now be negated using a minus sign. 
- QuerySet.order_by()and- distinct(*fields)now support using field transforms.
- BooleanFieldcan now be- null=True. This is encouraged instead of- NullBooleanField, which will likely be deprecated in the future.
- The new - QuerySet.explain()method displays the database's execution plan of a queryset's query.
- QuerySet.raw()now supports- prefetch_related().
Request と Response¶
- Added the - samesiteargument to- HttpResponse.set_cookie()to allow setting the- SameSitecookie flag.
- The new - as_attachmentargument for- FileResponsesets the- Content-Dispositionheader to make the browser ask if the user wants to download the file.- FileResponsealso tries to set the- Content-Typeand- Content-Lengthheaders where appropriate.
テンプレート¶
- The new - json_scriptfilter safely outputs a Python object as JSON, wrapped in a- <script>tag, ready for use with JavaScript.
テスト¶
- Added test - Clientsupport for 307 and 308 redirects.
- The test - Clientnow serializes a request data dictionary as JSON if- content_type='application/json'. You can customize the JSON encoder with test client's- json_encoderparameter.
- The new - SimpleTestCase.assertWarnsMessage()method is a simpler version of- assertWarnsRegex().
Backwards incompatible changes in 2.1¶
データベースバックエンド API¶
このセクションでは、サードパーティのデータベースバックエンドで必要になる可能性のある変更について説明します。
- To adhere to PEP 249, exceptions where a database doesn't support a feature are changed from - NotImplementedErrorto- django.db.NotSupportedError.
- Renamed the - allow_sliced_subqueriesdatabase feature flag to- allow_sliced_subqueries_with_in.
- DatabaseOperations.distinct_sql()now requires an additional- paramsargument and returns a tuple of SQL and parameters instead of an SQL string.
- DatabaseFeatures.introspected_boolean_field_typeis changed from a method to a property.
django.contrib.gis¶
- Support for SpatiaLite 4.0 is removed. 
MySQL 5.5 に対するサポートの終了¶
The end of upstream support for MySQL 5.5 is December 2018. Django 2.1 supports MySQL 5.6 and higher.
PostgreSQL 9.3 に対するサポートの終了¶
The end of upstream support for PostgreSQL 9.3 is September 2018. Django 2.1 supports PostgreSQL 9.4 and higher.
Removed BCryptPasswordHasher from the default PASSWORD_HASHERS setting¶
If you used bcrypt with Django 1.4 or 1.5 (before BCryptSHA256PasswordHasher
was added in Django 1.6), you might have some passwords that use the
BCryptPasswordHasher hasher.
You can check if that's the case like this:
from django.contrib.auth import get_user_model
User = get_user_model()
User.objects.filter(password__startswith="bcrypt$$")
If you want to continue to allow those passwords to be used, you'll
have to define the PASSWORD_HASHERS setting (if you don't already)
and include 'django.contrib.auth.hashers.BCryptPasswordHasher'.
Moved wrap_label widget template context variable¶
To fix the lack of <label> when using RadioSelect and
CheckboxSelectMultiple with MultiWidget, the wrap_label context
variable now appears as an attribute of each option. For example, in a custom
input_option.html template, change {% if wrap_label %} to
{% if widget.wrap_label %}.
Considerations for the new model "view" permission¶
Custom admin forms need to take the view-only case into account¶
With the new "view" permission, existing custom admin forms may raise errors
when a user doesn't have the change permission because the form might access
nonexistent fields. Fix this by overriding ModelAdmin.get_form() and
checking if the user has the "change" permissions and returning the default
form if not:
class MyAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if not self.has_change_permission(request, obj):
            return super().get_form(request, obj, **kwargs)
        return CustomForm
New default view permission could allow unwanted access to admin views¶
If you have a custom permission with a codename of the form
view_<modelname>, the new view permission handling in the admin will allow
view access to the changelist and detail pages for those models. If this is
unwanted, you must change your custom permission codename.
その他¶
- The minimum supported version of - mysqlclientis increased from 1.3.3 to 1.3.7.
- SQLite < 3.7.15 に対するサポートが削除されました。 
- The date format of - Set-Cookie's- Expiresdirective is changed to follow RFC 7231 Section 7.1.1.1 instead of Netscape's cookie standard. Hyphens present in dates like- Tue, 25-Dec-2018 22:26:13 GMTare removed. This change should be merely cosmetic except perhaps for antiquated browsers that don't parse the new format.
- allowed_hostsis now a required argument of private API- django.utils.http.is_safe_url().
- The - multipleattribute rendered by the- SelectMultiplewidget now uses HTML5 boolean syntax rather than XHTML's- multiple="multiple".
- HTML rendered by form widgets no longer includes a closing slash on void elements, e.g. - <br>. This is incompatible within XHTML, although some widgets already used aspects of HTML5 such as boolean attributes.
- The value of - SelectDateWidget's empty options is changed from 0 to an empty string, which mainly may require some adjustments in tests that compare HTML.
- User.has_usable_password()and the- is_password_usable()function no longer return- Falseif the password is- Noneor an empty string, or if the password uses a hasher that's not in the- PASSWORD_HASHERSsetting. This undocumented behavior was a regression in Django 1.6 and prevented users with such passwords from requesting a password reset. Audit your code to confirm that your usage of these APIs don't rely on the old behavior.
- Since migrations are now loaded from - .pycfiles, you might need to delete them if you're working in a mixed Python 2 and Python 3 environment.
- Using - Noneas a- django.contrib.postgres.fields.JSONFieldlookup value now matches objects that have the specified key and a null value rather than objects that don't have the key.
- The admin CSS class - field-boxis renamed to- fieldBoxto prevent conflicts with the class given to model fields named "box".
- Since the admin's - actions.html,- change_list_results.html,- date_hierarchy.html,- pagination.html,- prepopulated_fields_js.html,- search_form.html, and- submit_line.htmltemplates can now be overridden per app or per model, you may need to rename existing templates with those names that were written for a different purpose.
- QuerySet.raw()now caches its results like regular querysets. Use- iterator()if you don't want caching.
- The database router - allow_relation()method is called in more cases. Improperly written routers may need to be updated accordingly.
- Translations are no longer deactivated before running management commands. If your custom command requires translations to be deactivated (for example, to insert untranslated content into the database), use the new @no_translations decorator. 
- Management commands no longer allow the abbreviated forms of the - --settingsand- --pythonpatharguments.
- The private - django.db.models.sql.constants.QUERY_TERMSconstant is removed. The- get_lookup()and- get_lookups()methods of the Lookup Registration API may be suitable alternatives. Compared to the- QUERY_TERMSconstant, they allow your code to also account for any custom lookups that have been registered.
- py-bcryptはメンテナンスされていないため、互換性を削除しました。代替として bcrypt を使用してください。
2.1 で非推奨になった機能¶
その他¶
- The - ForceRHRGIS function is deprecated in favor of the new- ForcePolygonCWfunction.
- django.utils.http.cookie_date()is deprecated in favor of- http_date(), which follows the format of the latest RFC.
- {% load staticfiles %}and- {% load admin_static %}are deprecated in favor of- {% load static %}, which works the same.
- django.contrib.staticfiles.templatetags.static()is deprecated in favor of- django.templatetags.static.static().
- Support for - InlineModelAdmin.has_add_permission()methods that don't accept- objas the second positional argument will be removed in Django 3.0.
2.1 で削除された機能¶
These features have reached the end of their deprecation cycle and are removed in Django 2.1. See 1.11 で非推奨となった機能 for details, including how to remove usage of these features.
- contrib.auth.views.login(),- logout(),- password_change(),- password_change_done(),- password_reset(),- password_reset_done(),- password_reset_confirm(), and- password_reset_complete()are removed.
- The - extra_contextparameter of- contrib.auth.views.logout_then_login()is removed.
- django.test.runner.setup_databases()is removed.
- django.utils.translation.string_concat()is removed.
- django.core.cache.backends.memcached.PyLibMCCacheno longer supports passing- pylibmcbehavior settings as top-level attributes of- OPTIONS.
- The - hostparameter of- django.utils.http.is_safe_url()is removed.
- Silencing of exceptions raised while rendering the - {% include %}template tag is removed.
- DatabaseIntrospection.get_indexes()is removed.
- The - authenticate()method of authentication backends requires- requestas the first positional argument.
- The - django.db.models.permalink()decorator is removed.
- The - USE_ETAGSsetting is removed.- CommonMiddlewareand- django.utils.cache.patch_response_headers()no longer set ETags.
- The - Model._meta.has_auto_fieldattribute is removed.
- url()'s support for inline flags in regular expression groups (- (?i),- (?L),- (?m),- (?s), and- (?u)) is removed.
- Support for - Widget.render()methods without the- rendererargument is removed.