Django 4.0 versionsinformation¶
7 december 2021
Välkommen till Django 4.0!
Dessa versionsinformation täcker nya funktioner, samt några bakåtkompatibla ändringar som du vill vara medveten om när du uppgraderar från Django 3.2 eller tidigare. Vi har börjat utfasningsprocessen för vissa funktioner.
Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.
Kompatibilitet med Python¶
Django 4.0 stöder Python 3.8, 3.9 och 3.10. Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.
Django 3.2.x-serien är den sista som stöder Python 3.6 och 3.7.
Vad är nytt i Django 4.0¶
zoneinfo standardimplementering av tidszon¶
Standardbiblioteket Pythons zoneinfo är nu standardimplementeringen av tidszoner i Django.
Detta är nästa steg i migrationen från att använda pytz till att använda zoneinfo. Django 3.2 tillät användning av tidszoner som inte är pytz. Django 4.0 gör zoneinfo till standardimplementering. Stöd för pytz är nu föråldrat och kommer att tas bort i Django 5.0.
zoneinfo är en del av Pythons standardbibliotek från Python 3.9. Paketet backports.zoneinfo installeras automatiskt tillsammans med Django om du använder Python 3.8.
Övergången till zoneinfo bör vara i stort sett transparent. Val av aktuell tidszon, konvertering av datatidsinstanser till aktuell tidszon i formulär och mallar, samt operationer på medvetna datatider i UTC påverkas inte.
Men om du arbetar med tidszoner som inte är UTC och använder API:erna pytz normalize() och localize(), eventuellt med inställningen TIME_ZONE, måste du granska din kod eftersom pytz och zoneinfo inte är helt likvärdiga.
För att ge tid för en sådan granskning tillåter övergångsinställningen USE_DEPRECATED_PYTZ fortsatt användning av pytz under 4.x releasecykeln. Denna inställning kommer att tas bort i Django 5.0.
Dessutom kan ett pytz_deprecation_shim-paket, skapat av zoneinfo-författaren, användas för att hjälpa till med migreringen från pytz. Detta paket innehåller shims som hjälper dig att ta bort pytz på ett säkert sätt och har en detaljerad migreringsguide` som visar hur man flyttar till de nya zoneinfo API:erna.
Att använda pytz_deprecation_shim och övergångsinställningen USE_DEPRECATED_PYTZ rekommenderas om du behöver en gradvis uppdateringsväg.
Funktionella unika begränsningar¶
Det nya *expressions positionella argumentet för UniqueConstraint() gör det möjligt att skapa funktionella unika begränsningar för uttryck och databasfunktioner. Till exempel:
from django.db import models
from django.db.models import UniqueConstraint
from django.db.models.functions import Lower
class MyModel(models.Model):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
class Meta:
constraints = [
UniqueConstraint(
Lower("first_name"),
Lower("last_name").desc(),
name="first_last_name_unique",
),
]
Funktionella unika begränsningar läggs till i modeller med hjälp av alternativet Meta.constraints.
scrypt lösenord hasher¶
Den nya scrypt password hasher är säkrare och rekommenderas framför PBKDF2. Det är dock inte standard eftersom det kräver OpenSSL 1.1+ och mer minne.
Redis cache backend¶
Den nya django.core.cache.backends.redis.RedisCache cache backend ger inbyggt stöd för cachelagring med Redis. redis-py 3.0.0 eller högre krävs. För mer information, se dokumentation om cachelagring med Redis i Django.
Mallbaserad rendering av formulär¶
Forms, Formsets, och ErrorList renderas nu med hjälp av mallmotorn för att förbättra anpassningen. Se nya render(), get_context(), och template_name för Form och formset rendering för Formset.
Mindre funktioner¶
django.contrib.admin¶
Mallen
admin/base.htmlhar nu ett nytt blockheadersom innehåller administratörssidans rubrik.Med den nya metoden
ModelAdmin.get_formset_kwargs()kan du anpassa de nyckelordsargument som skickas till konstruktören för ett formulär.Sidofältet för navigering har nu ett verktygsfält för snabbfilter.
Den nya kontextvariabeln
modelsom innehåller modellklassen för varje modell läggs till i metodenAdminSite.each_context().Med det nya attributet
ModelAdmin.search_help_textkan du ange en beskrivande text för sökrutan.Attributet
InlineModelAdmin.verbose_name_pluralhar nu fallback till attributetInlineModelAdmin.verbose_name+'s'.jQuery uppgraderas från version 3.5.1 till 3.6.0.
django.contrib.admindocs¶
Admindocs tillåter nu esoteriska inställningar där
ROOT_URLCONFinte är en sträng.Modellavsnittet i
admindocsvisar nu cachelagrade egenskaper.
django.contrib.auth¶
Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 260 000 till 320 000.
Det nya attributet
LoginView.next_pageoch metodenget_default_redirect_url()gör det möjligt att anpassa omdirigeringen efter inloggning.
django.contrib.gis¶
Stöd för SpatiaLite 5 har lagts till.
GDALRastergör det nu möjligt att skapa raster i alla virtuella GDAL-filsystem.Den nya
GISModelAdmin-klassen gör det möjligt att anpassa den widget som används förGeometryField. Detta uppmuntras istället för de föråldradeGeoModelAdminochOSMGeoAdmin.
django.contrib.postgres¶
PostgreSQL-backend stöder nu anslutning med ett servicenamn. Se PostgreSQL-anslutningsinställningar för mer information.
Den nya
AddConstraintNotValid-operationen gör det möjligt att skapa kontrollbegränsningar på PostgreSQL utan att verifiera att alla befintliga rader uppfyller den nya begränsningen.Den nya
ValidateConstraint-operationen tillåter validering av kontrollbegränsningar som skapades medAddConstraintNotValidpå PostgreSQL.Det nya
ArraySubquery()-uttrycket gör det möjligt att använda underfrågor för att konstruera listor med värden på PostgreSQL.Den nya
trigram_word_similarlookupen ochTrigramWordDistance()ochTrigramWordSimilarity()uttrycken tillåter användning av trigramordlikhet.
django.contrib.staticfiles¶
ManifestStaticFilesStorageersätter nu sökvägar till JavaScript-källkartreferenser med deras hashade motsvarigheter.Det nya argumentet
manifest_storageiManifestFilesMixinochManifestStaticFilesStoragegör det möjligt att anpassa manifestfilens lagring.
Cache¶
Det nya async-API:et för
django.core.cache.backends.base.BaseCachepåbörjar processen med att göra cache-backends async-kompatibla. De nya async-metoderna har alla namn med prefixeta, t.ex.aadd(),aget(),aset(),aget_or_set()elleradelete_many().I fortsättningen kommer prefixet
aatt användas för asynkrona varianter av metoder i allmänhet.
CSRF¶
CSRF-skydd konsulterar nu
Origin-huvudet, om det finns. För att underlätta detta krävs vissa ändringar iCSRF_TRUSTED_ORIGINS.
Formulär¶
ModelChoiceFieldinkluderar nu det angivna värdet i argumentetparamsi ett uppkommetValidationErrorför felmeddelandetinvalid_choice. Detta gör att anpassade felmeddelanden kan använda platshållaren%(value)s.BaseFormSetåterger nu fel som inte är formulärfel med en extra klassnonformför att hjälpa till att skilja dem från formulärspecifika fel.BaseFormSetgör det nu möjligt att anpassa widgeten som används när formulär raderas viacan_deletegenom att ställa in attributetdeletion_widgeteller åsidosätta metodenget_deletion_widget().
Internationalisering¶
Stöd och översättningar för det malaysiska språket har lagts till.
Generiska åsikter¶
DeleteViewanvänder nuFormMixin, vilket gör att du kan tillhandahålla enForm-underklass, med till exempel en kryssruta, för att bekräfta radering. Dessutom gör detta attDeleteViewkan fungera meddjango.contrib.messages.views.SuccessMessageMixin.I enlighet med
FormMixinhanteras radering av objekt för POST-begäranden iform_valid(). Anpassad raderingslogik idelete()-hanterare bör flyttas tillform_valid(), eller en delad hjälpmetod, efter behov.
Loggning¶
Aliaset för den databas som används i ett SQL-anrop skickas nu som extra kontext tillsammans med varje meddelande till loggern django.db.backends.
Kommandon för hantering¶
Hanteringskommandot
runserverstöder nu alternativet--skip-checks.På PostgreSQL stöder
dbshellnu att ange en lösenordsfil.The
shellcommand now respectssys.__interactivehook__at startup. This allows loading shell history between interactive sessions. As a consequence,readlineis no longer loaded if running in isolated mode.Det nya attributet
BaseCommand.suppressed_base_argumentsgör det möjligt att undertrycka standardkommandoalternativ som inte stöds i hjälputmatningen.De nya alternativen
startapp --excludeochstartproject --excludegör det möjligt att utesluta kataloger från mallen.
Modeller¶
Ny
QuerySet.contains(obj)-metod returnerar om queryset innehåller det givna objektet. Detta försöker utföra frågan på det enklaste och snabbaste sättet som möjligt.Det nya argumentet
precisioni databasfunktionenRound()gör det möjligt att ange antalet decimaler efter avrundning.QuerySet.bulk_create()ställer nu in primärnyckeln på objekt när SQLite 3.35+ används.DurationFieldhar nu stöd för att multiplicera och dividera med skalära värden på SQLite.QuerySet.bulk_update()returnerar nu antalet objekt som uppdaterats.Det nya attributet
Expression.empty_result_set_valuegör det möjligt att ange ett värde som ska returneras när funktionen används för en tom resultatmängd.The
skip_lockedargument ofQuerySet.select_for_update()is now allowed on MariaDB 10.6+.Lookup-uttryck kan nu användas iQuerySet-annoteringar, aggregeringar och direkt i filter.Det nya argumentet default för inbyggda aggregat gör det möjligt att ange ett värde som ska returneras när frågeuppsättningen (eller grupperingen) inte innehåller några poster, i stället för
None.
Förfrågningar och svar¶
Klassen :~django.middleware.security.SecurityMiddleware lägger nu till rubriken Cross-Origin Opener Policy med värdet
'same-origin'för att förhindra att popup-fönster med olika ursprung delar samma webbläsarkontext. Du kan förhindra att detta huvud läggs till genom att ange inställningenSECURE_CROSS_ORIGIN_OPENER_POLICYtillNone.
Signaler¶
The new
stdoutargument forpre_migrate()andpost_migrate()signals allows redirecting output to a stream-like object. It should be preferred oversys.stdoutandprint()when emitting verbose output in order to allow proper capture when testing.
Mallar¶
floatformatmallfilter tillåter nu användning av suffixetuför att tvinga fram inaktivering av lokalisering.
Tester¶
Det nya
serialized_aliases-argumentet idjango.test.utils.setup_databases()bestämmer vilkaDATABASES-alias-testdatabaser som ska ha sitt tillstånd serialiserat för att möjliggöra användning av serialized_rollback-funktionen.Alternativet
test --bufferstöder nu parallella tester.The new
loggerargument toDiscoverRunnerallows a Python logger to be used for logging.Den nya metoden
DiscoverRunner.log()ger ett sätt att logga meddelanden som använderDiscoverRunner.logger, eller skriver ut till konsolen om den inte är inställd.DiscoverRunnerkan nu utföra tester i en slumpmässig ordning med hjälp avtest --shuffle.Alternativet
test --parallelstöder nu värdetautoför att köra en testprocess för varje processorkärna.TestCase.captureOnCommitCallbacks()fångar nu upp nya callbacks som läggs till när man körtransaction.on_commit()callbacks.
Bakåtkompatibla ändringar i 4.0¶
Databas backend API¶
I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.
metoderna
DatabaseOperations.year_lookup_bounds_for_date_field()ochyear_lookup_bounds_for_datetime_field()tar nu det valfria argumentetiso_yearför att stödja gränser för ISO-8601 veckonumrerade år.Det andra argumentet i metoderna
DatabaseSchemaEditor._unique_sql()och_create_unique_sql()är nufieldsistället förcolumns.
django.contrib.gis¶
Stöd för PostGIS 2.3 har tagits bort.
Stöd för GDAL 2.0 och GEOS 3.5 har tagits bort.
Tappat stöd för PostgreSQL 9.6¶
Uppströmsstöd för PostgreSQL 9.6 slutar i november 2021. Django 4.0 stöder PostgreSQL 10 och högre.
Dessutom ökas den minsta versionen som stöds av psycopg2 från 2.5.4 till 2.8.4, eftersom psycopg2 2.8.4 är den första utgåvan som stöder Python 3.8.
Borttaget stöd för Oracle 12.2 och 18c¶
Uppströmsstöd för Oracle 12.2 upphör i mars 2022 och för Oracle 18c upphör det i juni 2021. Django 3.2 kommer att stödjas fram till april 2024. Django 4.0 stöder officiellt Oracle 19c.
CSRF_TRUSTED_ORIGINS ändringar¶
Formatändring¶
Värden i inställningen CSRF_TRUSTED_ORIGINS måste innehålla schemat (t.ex. 'http://' eller 'https://') i stället för bara värdnamnet.
Dessutom måste värden som börjar med en punkt nu också innehålla en asterisk före punkten. Ändra till exempel .example.com till 'https://*.example.com'.
En systemkontroll upptäcker eventuella nödvändiga ändringar.
Konfigurering av den kan nu krävas¶
Eftersom CSRF-skydd nu konsulterar rubriken Origin kan du behöva ställa in CSRF_TRUSTED_ORIGINS, särskilt om du tillåter förfrågningar från underdomäner genom att ställa in CSRF_COOKIE_DOMAIN (eller SESSION_COOKIE_DOMAIN om CSRF_USE_SESSIONS är aktiverat) till ett värde som börjar med en punkt.
SecurityMiddleware ställer inte längre in rubriken X-XSS-Protection¶
Klassen:~django.middleware.security.SecurityMiddleware ställer inte längre in rubriken X-XSS-Protection om inställningen SECURE_BROWSER_XSS_FILTER är True. Inställningen är borttagen.
De flesta moderna webbläsare respekterar inte HTTP-rubriken X-XSS-Protection. Du kan använda Content-Security-Policy utan att tillåta 'unsafe-inline'-skript istället.
Om du vill stödja äldre webbläsare och ställa in rubriken, använd den här raden i en anpassad middleware:
response.headers.setdefault("X-XSS-Protection", "1; mode=block")
Migrationer autodetektor förändringar¶
Autodetektorn för migreringar använder nu modelltillstånd i stället för modellklasser. Dessutom anger migreringsåtgärder för fälten ForeignKey och ManyToManyField inte längre attribut som inte skickades till fälten under initialiseringen.
Som en bieffekt kan körning av makemigrations generera no-op AlterField operationer för ManyToManyField och ForeignKey fält i vissa fall.
DeleteView ändringar¶
DeleteView använder nu FormMixin för att hantera POST-begäranden. Som en följd av detta bör all anpassad borttagningslogik i delete()-hanterare flyttas till form_valid(), eller en delad hjälpmetod, om så krävs.
Ändringar i namnschemat för tabeller och kolumner i Oracle¶
Django 4.0 ändrade oavsiktligt namnschemat för tabeller och kolumner på Oracle. Detta orsakar fel för modeller och fält med namn som är längre än 30 tecken. Tyvärr krävs det att vissa Oracle-tabeller och kolumner byter namn. Använd uppgraderingsskriptet i 33789 för att generera RENAME-satser för att ändra namngivningsschemat.
Diverse¶
Stöd för
cx_Oracle< 7.0 har tagits bort.För att möjliggöra servering av en Django-webbplats på en underväg utan att ändra värdet på
STATIC_URL, tas det inledande snedstrecket bort från den inställningen (nu'static/') i standardmallenstartproject.Metoden
AdminSiteför adminvynindexdekoreras inte längre mednever_cachenär den nås direkt, snarare än via den rekommenderade egenskapenAdminSite.urlseller metodenAdminSite.get_urls().Operationer som inte stöds på en skivad queryset ger nu upphov till
TypeErroristället förAssertionError.Den odokumenterade funktionen
django.test.runner.reorder_suite()har bytt namn tillreorder_tests(). Den accepterar nu en iterabel av tester snarare än en testsvit och returnerar en iterator av tester.Anrop av
FileSystemStorage.delete()med ett tomtnamnger nu upphov tillValueErroristället förAssertionError.Anrop av
EmailMultiAlternatives.attach_alternative()ellerEmailMessage.attach()med ogiltigacontentellermimetypeargument ger nu upphov tillValueErroristället förAssertionError.assertHTMLEqual()anser inte längre att ett icke-booleskt attribut utan värde är lika med ett attribut med samma namn och värde.Tester som inte laddas, t.ex. på grund av syntaxfel, matchar nu alltid när man använder
test --tag.Den odokumenterade funktionen
django.contrib.admin.utils.lookup_needs_distinct()har bytt namn tilllookup_spawns_duplicates().Den odokumenterade metoden
HttpRequest.get_raw_uri()tas bort. MetodenHttpRequest.build_absolute_uri()kan vara ett lämpligt alternativ.Argumentet
objecti de odokumenterade metodernaModelAdmin.log_addition(),log_change()ochlog_deletion()har bytt namn tillobj.RssFeed,Atom1Feed, och deras underklasser emitterar nu element utan innehåll som självstängande taggar.NodeList.render()kastar inte längre utdata frånrender()-metoden för enskilda noder till en sträng.Node.render()bör alltid returnera en sträng som dokumenterat.Egenskapen
where_classidjango.db.models.sql.query.Queryoch argumentetwhere_classtill den privata metodenget_extra_restriction()iForeignObjectochForeignObjectReltas bort. Om det behövs, initieradjango.db.models.sql.where.WhereNodeistället.Argumentet
filter_clausei den odokumenterade metodenQuery.add_filter()ersätts av två positionella argumentfilter_lhsochfilter_rhs.CsrfViewMiddlewareanvänder nurequest.META['CSRF_COOKIE_NEEDS_UPDATE']i stället förrequest.META['CSRF_COOKIE_USED'],request.csrf_cookie_needs_resetochresponse.csrf_cookie_setför att spåra om CSRF-cookien ska skickas. Detta är ett odokumenterat, privat API.Den odokumenterade konstanten
TRANSLATOR_COMMENT_MARKflyttas fråndjango.template.basetilldjango.utils.translation.template.Argumentet
real_appsi den odokumenterade metodendjango.db.migrations.state.ProjectState.__init__()måste nu vara ett set om det tillhandahålls.RadioSelectochCheckboxSelectMultiplewidgets återges nu i<div>taggar så att de meddelas mer koncist av skärmläsare. Om du behöver det tidigare beteendet, åsidosätt widgetmallen med lämplig mall från Django 3.2.Mallfiltret
floatformatär inte längre beroende av inställningenUSE_L10Noch returnerar alltid lokaliserad utdata. Använd suffixetuför att inaktivera lokalisering.Standardvärdet för inställningen
USE_L10Nändras tillTrue. Se Lokaliseringsavsnittet ovan för mer information.Som en del av flytta till zoneinfo,
django.utils.timezone.utcändras till aliasdatetime.timezone.utc`.Den lägsta versionen av
asgirefsom stöds har ökats från 3.3.2 till 3.4.1.
Funktioner som inte längre är aktuella i 4.0¶
Användning av pytz tidszoner¶
Som en del av flytten till zoneinfo är användningen av tidszonerna pytz avförd.
Följaktligen är argumenten is_dst till följande också föråldrade:
Stöd för användning av pytz kommer att tas bort i Django 5.0.
Stöd för tidszoner¶
För att följa god praxis kommer standardvärdet för inställningen USE_TZ att ändras från False till True, och stöd för tidszoner kommer att aktiveras som standard i Django 5.0.
Observera att standardfilen settings.py som skapats av django-admin startproject innehåller USE_TZ = True sedan Django 1.4.
Du kan ställa in USE_TZ till False i dina projektinställningar innan dess för att välja bort.
Lokalisering¶
För att följa god praxis har standardvärdet för inställningen USE_L10N ändrats från False till True.
Dessutom är USE_L10N föråldrad från och med denna utgåva. Från och med Django 5.0 kommer som standard alla datum eller nummer som visas av Django att vara lokaliserade.
Taggen {% localize %} och filtren localize/ unlocalize kommer fortfarande att respekteras av Django.
Diverse¶
testinställningen
SERIALIZEär avskriven eftersom den kan härledas fråndatabasesmed alternativet serialized_rollback aktiverat.Den odokumenterade modulen
django.utils.baseconvär föråldrad.Den odokumenterade modulen
django.utils.datetime_safeär föråldrad.Standardprotokollet för webbplatskartor för webbplatskartor som byggs utanför kontexten för en begäran kommer att ändras från
'httptill'httpsi Django 5.0.Argumentet
extra_testsförDiscoverRunner.build_suite()ochDiscoverRunner.run_tests()är föråldrat.Aggregaten
ArrayAgg,JSONBAggochStringAggreturnerarNonenär det inte finns några rader istället för[],[]respektive''i Django 5.0. Om du behöver det tidigare beteendet, ställ uttryckligen indefaulttillValue([]),Value('[]')ellerValue('').Klasserna
django.contrib.gis.admin.GeoModelAdminochOSMGeoAdminär föråldrade. AnvändModelAdminochGISModelAdministället.Eftersom formulärrendering nu använder mallmotorn, är den odokumenterade hjälpmetoden
BaseForm._html_output()föråldrad.Möjligheten att returnera en
strfrånErrorListochErrorDictär föråldrad. Det förväntas att dessa metoder returnerar enSafeString.
Funktioner borttagna i 4.0¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 4.0.
Se Funktioner som inte längre är aktuella i 3.0 för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.
django.utils.http.urlquote(),urlquote_plus(),urlunquote()ochurlunquote_plus()tas bort.django.utils.encoding.force_text()ochsmart_text()tas bort.django.utils.translation.ugettext(),ugettext_lazy(),ugettext_noop(),ungettext()ochungettext_lazy()tas bort.django.views.i18n.set_language()ställer inte in användarens språk irequest.session(nyckel_language).alias=Nonekrävs i signaturen för underklassernadjango.db.models.Expression.get_group_by_cols().django.utils.text.unescape_entities()har tagits bort.django.utils.http.is_safe_url()har tagits bort.
Se Funktioner som inte längre är aktuella i 3.1 för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.
Inställningen
PASSWORD_RESET_TIMEOUT_DAYStas bort.Uppslagsfunktionen
isnulltillåter inte längre att icke-booleska värden används som höger sida.Undantagsklassen
django.db.models.query_utils.InvalidQueryhar tagits bort.Ingångspunkten
django-admin.pytas bort.Metoden
HttpRequest.is_ajax()har tagits bort.Stöd för kodningsformatet före Django 3.1 för cookie-värden som används av
django.contrib.messages.storage.cookie.CookieStoragehar tagits bort.Stöd för lösenordsåterställningstoken från före Django 3.1 på administratörssidan (som använder SHA-1-hashalgoritmen) har tagits bort.
Stöd för kodningsformatet för sessioner före Django 3.1 har tagits bort.
Stöd för signaturer från före Django 3.1
django.core.signing.Signer(kodade med SHA-1-algoritmen) har tagits bort.Stöd för signaturer från före Django 3.1
django.core.signing.dumps()(kodade med SHA-1-algoritmen) idjango.core.signing.loads()har tagits bort.Stöd för användarsessioner före Django 3.1 (som använder SHA-1-algoritmen) har tagits bort.
Argumentet
get_responsefördjango.utils.deprecation.MiddlewareMixin.__init__()är obligatoriskt och accepterar inteNone.Argumentet
providing_argsfördjango.dispatch.Signalhar tagits bort.Argumentet
lengthfördjango.utils.crypto.get_random_string()är obligatoriskt.Meddelandet
listförModelMultipleChoiceFieldhar tagits bort.Stöd för att skicka råa kolumnaliaser till
QuerySet.order_by()har tagits bort.Modellfältet
NullBooleanFieldtas bort, med undantag för stöd i historiska migreringar.django.conf.urls.url()har tagits bort.Modellfältet
django.contrib.postgres.fields.JSONFieldtas bort, förutom för stöd i historiska migreringar.django.contrib.postgres.fields.jsonb.KeyTransformochdjango.contrib.postgres.fields.jsonb.KeyTextTransformtas bort.django.contrib.postgres.forms.JSONFieldhar tagits bort.Malltaggarna
{% ifequal %}och{% ifnotequal %}tas bort.Övergångsinställningen
DEFAULT_HASHING_ALGORITHMtas bort.