Release Notes
...
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
.
...
Some widget values, such as <select>
options, are now localized if settings.USE_L10N=True
. You could revert to the old behavior with custom widget templates that uses the localize
template tag to turn off localization.
django.template.backends.django.Template.render()
prohibits non-dict context
Jira Legacy | ||||||||
---|---|---|---|---|---|---|---|---|
|
For compatibility with multiple template engines, django.template.backends.django.Template.render()
(returned from high-level template loader APIs such as loader.get_template()
) must receive a dictionary of context rather than Context
or RequestContext
. If you were passing either of the two classes, pass a dictionary instead – doing so is backwards-compatible with older versions of Django.
...
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.