Release Notes
...
collectstatic
may now fail during post-processing
when using a hashed static files storage if a reference loop exists (e.g.Jira Legacy showSummary false server JIRA (openedx.atlassian.net) serverId 13fd1930-5608-3aac-a5dd-21b934d3a4b4 key PLAT-1363 'foo.css'
references'bar.css'
which itself references'foo.css'
) or if the chain of files referencing other files is too deep to resolve in several passes. In the latter case, increase the number of passes usingManifestStaticFilesStorage.max_post_process_passes
.- When using
ManifestStaticFilesStorage
, static files not found in the manifest at runtime now raise aValueError
instead of returning an unchanged path. You can revert to the old behavior by settingManifestStaticFilesStorage.manifest_strict
toFalse
.
...
from tzlocal import get_localzone TIME_ZONE = get_localzone().zone
This works similar to settings.TIME_ZONE = None
except that it also sets os.environ['TZ']
. Let us know if there’s a use case where you find you can’t adapt your code to set a TIME_ZONE
.
...
from django.db import models class MyModel(models.Model): ... @models.permalink def url(self): return ('guitarist_detail', [self.slug])
becomes:
from django.db import models from django.urls import reverse class MyModel(models.Model): ... def url(self): return reverse('guitarist_detail', args=[self.slug])
Miscellaneous¶
contrib.auth
’slogin()
andlogout()
function-based views are deprecated in favor of new class-based viewsLoginView
andLogoutView
.- The unused
extra_context
parameter ofcontrib.auth.views.logout_then_login()
is deprecated. contrib.auth
’spassword_change()
,password_change_done()
,password_reset()
,password_reset_done()
,password_reset_confirm()
, andpassword_reset_complete()
function-based views are deprecated in favor of new class-based viewsPasswordChangeView
,PasswordChangeDoneView
,PasswordResetView
,PasswordResetDoneView
,PasswordResetConfirmView
, andPasswordResetCompleteView
.django.test.runner.setup_databases()
is moved todjango.test.utils.setup_databases()
. The old location is deprecated.django.utils.translation.string_concat()
is deprecated in favor ofdjango.utils.text.format_lazy()
.string_concat(*strings)
can be replaced byformat_lazy('{}' * len(strings), *strings)
.- For the
PyLibMCCache
cache backend, passingpylibmc
behavior settings as top-level attributes ofOPTIONS
is deprecated. Set them under abehaviors
key withinOPTIONS
instead. - The
host
parameter ofdjango.utils.http.is_safe_url()
is deprecated in favor of the newallowed_hosts
parameter. - Silencing exceptions raised while rendering the
{% include %}
template tag is deprecated as the behavior is often more confusing than helpful. In Django 2.1, the exception will be raised. DatabaseIntrospection.get_indexes()
is deprecated in favor ofDatabaseIntrospection.get_constraints()
.authenticate()
now passes arequest
argument to theauthenticate()
method of authentication backends. Support for methods that don’t acceptrequest
as the first positional argument will be removed in Django 2.1.- The
USE_ETAGS
setting is deprecated in favor ofConditionalGetMiddleware
which now adds theETag
header to responses regardless of the setting.CommonMiddleware
anddjango.utils.cache.patch_response_headers()
will no longer set ETags when the deprecation ends. Model._meta.has_auto_field
is deprecated in favor of checking ifModel._meta.auto_field is not None
.- Using regular expression groups with
iLmsu#
inurl()
is deprecated. The only group that’s useful is(?i)
for case-insensitive URLs, however, case-insensitive URLs aren’t a good practice because they create multiple entries for search engines, for example. An alternative solution could be to create ahandler404
that looks for uppercase characters in the URL and redirects to a lowercase equivalent. - The
renderer
argument is added to theWidget.render()
method. Methods that don’t accept that argument will work through a deprecation period.