6 april 2021
Välkommen till Django 3.2!
Dessa release notes täcker nya funktioner, samt några bakåtkompatibla förändringar som du vill vara medveten om när du uppgraderar från Django 3.1 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.
Django 3.2 betecknas som en long-term support release. Den kommer att få säkerhetsuppdateringar i minst tre år efter lanseringen. Stöd för den tidigare LTS, Django 2.2, kommer att upphöra i april 2022.
Django 3.2 stöder Python 3.6, 3.7, 3.8, 3.9 och 3.10 (från och med 3.2.9). Vi rekommenderar starkt och stöder endast officiellt den senaste utgåvan av varje serie.
De flesta pluggbara applikationer definierar en AppConfig-underklass i en apps.py-undermodul. Många definierar en variabel default_app_config som pekar på denna klass i sin __init__.py.
När undermodulen apps.py finns och definierar en enda AppConfig-underklass, använder Django nu den konfigurationen automatiskt, så du kan ta bort default_app_config.
default_app_config gjorde det möjligt att endast deklarera applikationens sökväg i INSTALLED_APPS (t.ex. 'django.contrib.admin') istället för appkonfigurationens sökväg (t.ex. 'django.contrib.admin.apps.AdminConfig'). Det infördes för bakåtkompatibilitet med den tidigare stilen, med avsikten att byta ekosystemet till den senare, men bytet skedde inte.
Med automatisk upptäckt av AppConfig behövs inte längre default_app_config. Som en konsekvens av detta är den utfasad.
Se Konfigurera applikationer för fullständig information.
När en modell definieras, om inget fält i en modell definieras med primary_key=True, läggs en implicit primärnyckel till. Typen av denna implicita primärnyckel kan nu styras via inställningen DEFAULT_AUTO_FIELD och attributet AppConfig.default_auto_field. Du behöver inte längre åsidosätta primärnycklar i alla modeller.
För att bibehålla det historiska beteendet är standardvärdet för DEFAULT_AUTO_FIELD AutoField. Från och med 3.2 genereras nya projekt med DEFAULT_AUTO_FIELD inställd på BigAutoField. Dessutom genereras nya appar med AppConfig.default_auto_field satt till BigAutoField. I en framtida Django-version kommer standardvärdet för DEFAULT_AUTO_FIELD att ändras till BigAutoField.
För att undvika oönskade migreringar i framtiden kan du antingen uttryckligen ange DEFAULT_AUTO_FIELD till AutoField:
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
eller konfigurera det per app:
from django.apps import AppConfig
class MyAppConfig(AppConfig):
default_auto_field = "django.db.models.AutoField"
name = "my_app"
eller för varje enskild modell:
from django.db import models
class MyModel(models.Model):
id = models.AutoField(primary_key=True)
I väntan på att standardinställningen ändras kommer en systemkontroll att ge en varning om du inte har en explicit inställning för DEFAULT_AUTO_FIELD.
När du ändrar värdet på DEFAULT_AUTO_FIELD kan migreringar för primärnyckeln i befintliga automatiskt skapade genomgående tabeller inte genereras för närvarande. Se dokumentationen för DEFAULT_AUTO_FIELD för mer information om migrering av sådana tabeller.
Det nya *expressions positionella argumentet för Index() gör det möjligt att skapa funktionella index på uttryck och databasfunktioner. Till exempel:
from django.db import models
from django.db.models import F, Index, Value
from django.db.models.functions import Lower, Upper
class MyModel(models.Model):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
height = models.IntegerField()
weight = models.IntegerField()
class Meta:
indexes = [
Index(
Lower("first_name"),
Upper("last_name").desc(),
name="first_last_name_idx",
),
Index(
F("height") / (F("weight") + Value(5)),
name="calc_idx",
),
]
Funktionella index läggs till i modeller med hjälp av alternativet Meta.indexes.
pymemcache¶Den nya django.core.cache.backends.memcached.PyMemcacheCache cache-backend gör det möjligt att använda pymemcache-biblioteket för memcached. pymemcache 3.4.0 eller högre krävs. För mer information, se dokumentation om cachelagring i Django.
Den nya display()-dekoratorn gör det enkelt att lägga till alternativ till anpassade visningsfunktioner som kan användas med list_display eller readonly_fields.
På samma sätt gör den nya action()-dekoratorn det möjligt att enkelt lägga till alternativ till åtgärdsfunktioner som kan användas med actions.
Att använda @display-dekoratorn har fördelen att det nu är möjligt att använda @property-dekoratorn när man behöver ange attribut för den anpassade metoden. Tidigare var det nödvändigt att använda funktionen property() istället efter att ha tilldelat metoden de nödvändiga attributen.
Att använda dekoratorer har fördelen att dessa alternativ är lättare att upptäcka eftersom de kan föreslås av kompletteringsverktyg i kodredigerare. De är bara en bekvämlighet och ställer fortfarande in samma attribut på funktionerna under huven.
django.contrib.admin¶ModelAdmin.search_fields tillåter nu sökning mot citerade fraser med mellanslag.
Skrivskyddade relaterade fält återges nu som navigerbara länkar om målmodeller registreras i admin.
Administratören har nu stöd för teman och inkluderar ett mörkt tema som aktiveras enligt webbläsarens inställningar. Se Stöd för tematisering för mer information.
ModelAdmin.autocomplete_fields respekterar nu ForeignKey.to_field och ForeignKey.limit_choices_to vid sökning i en relaterad modell.
Administratören installerar nu en sista catch-all-vy som omdirigerar oautentiserade användare till inloggningssidan, oavsett om URL:en i övrigt är giltig. Detta skyddar mot en potentiell sekretessfråga för modelluppräkning.
Även om det inte rekommenderas kan du ställa in den nya AdminSite.final_catch_all_view till False för att inaktivera catch-all-vyn.
django.contrib.auth¶Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 216.000 till 260.000.
Standardvarianten för lösenordshashen Argon2 ändras till Argon2id. memory_cost och parallelism ökas till 102.400 respektive 8 för att matcha argon2-cffi standardinställningarna.
Om man ökar minneskostnaden ökar det erforderliga minnet från 512 KB till 100 MB. Detta är fortfarande ganska konservativt men kan leda till problem i minnesbegränsade miljöer. Om så är fallet kan den befintliga hasharen underklassas för att åsidosätta standardvärdena.
Standardsaltets entropi för lösenordshasharna Argon2, MD5, PBKDF2 och SHA-1 har ökats från 71 till 128 bitar.
django.contrib.contenttypes¶Det nya absolute_max-argumentet för generic_inlineformset_factory() gör det möjligt att anpassa det maximala antalet formulär som kan instansieras när man tillhandahåller POST-data. Se Begränsning av det maximala antalet instansierade formulär för mer information.
Det nya argumentet can_delete_extra för generic_inlineformset_factory() gör det möjligt att ta bort möjligheten att ta bort extra formulär. Se can_delete_extra för mer information.
django.contrib.gis¶Metoden GDALRaster.transform() stöder nu SpatialReference.
Klassen DataSource har nu stöd för pathlib.Path.
Klassen LayerMapping stöder nu pathlib.Path.
django.contrib.postgres¶Det nya ExclusionConstraint.include-attributet gör det möjligt att skapa täckande uteslutningsbegränsningar på PostgreSQL 12+.
Det nya attributet ExclusionConstraint.opclasses tillåter inställning av PostgreSQL-operatörsklasser.
Det nya attributet JSONBAgg.ordering bestämmer ordningsföljden för de aggregerade elementen.
Det nya attributet JSONBAgg.distinct avgör om aggregerade värden ska vara distinkta.
Operationen CreateExtension kontrollerar nu att tillägget redan finns i databasen och hoppar över migreringen om så är fallet.
De nya CreateCollation och RemoveCollation-operationerna gör det möjligt att skapa och släppa kollationer på PostgreSQL. Se Hantera kollationer med hjälp av migreringar för mer information.
Uppslagningar för ArrayField tillåter nu (icke-nästlade) arrayer som innehåller uttryck som höger sida.
Det nya OpClass() uttrycket gör det möjligt att skapa funktionella index på uttryck med en anpassad operatorklass. Se Funktionella index för mer information.
django.contrib.sitemaps¶De nya attributen Sitemap alternates, languages och x_default gör det möjligt att generera alternativ till lokaliserade versioner av dina sidor.
Tredjeparts databasbackends kan nu hoppa över eller markera som förväntade misslyckanden tester i Djangos testsvit med hjälp av de nya attributen DatabaseFeatures.django_test_skips och django_test_expected_failures.
Den nya no_append_slash()-dekoratorn gör att enskilda vyer kan uteslutas från APPEND_SLASH URL-normalisering.
Anpassade ExceptionReporter-underklasser kan nu definiera egenskaperna html_template_path och text_template_path för att åsidosätta de mallar som används för att rendera undantagsrapporter.
Den nya FileUploadHandler.upload_interrupted() callbacken gör det möjligt att hantera avbrutna uppladdningar.
Det nya absolute_max-argumentet för formset_factory(), inlineformset_factory() och modelformset_factory() gör det möjligt att anpassa det maximala antalet formulär som kan instansieras när man levererar POST-data. Se Begränsning av det maximala antalet instansierade formulär för mer information.
Det nya argumentet can_delete_extra för formset_factory(), inlineformset_factory() och modelformset_factory() gör det möjligt att ta bort möjligheten att radera extra formulär. Se can_delete_extra för mer information.
BaseFormSet rapporterar nu ett användarvänligt fel, snarare än att skapa ett undantag, när förvaltningsformuläret saknas eller har manipulerats. För att anpassa detta felmeddelande, skicka argumentet error_messages med nyckeln 'missing_management_form' när du instansierar formsetet.
Attributen week_format i WeekMixin och WeekArchiveView stöder nu veckoformatet '%V' ISO 8601.
loaddata stöder nu fixturer lagrade i XZ-arkiv (.xz) och LZMA-arkiv (.lzma).
dumpdata kan nu komprimera data i formaten bz2, gz, lzma eller xz.
makemigrations kan nu anropas utan en aktiv databasanslutning. I det fallet hoppas kontrollen av en konsekvent migreringshistorik över.
BaseCommand.requires_system_checks stöder nu angivande av en lista med taggar. Systemkontroller som är registrerade i de valda taggarna kommer att kontrolleras för fel innan kommandot körs. I tidigare versioner utfördes antingen alla eller inga av systemkontrollerna.
Stöd för färgad terminalutmatning i Windows har uppdaterats. Olika moderna terminalmiljöer upptäcks automatiskt och alternativen för att aktivera stöd i andra fall har förbättrats. Se Syntax färgläggning för mer information.
Den nya egenskapen Operation.migration_name_fragment gör det möjligt att ange ett filnamnsfragment som kommer att användas för att namnge en migration som endast innehåller den operationen.
Migreringar stöder nu serialisering av rena och konkreta sökvägsobjekt från pathlib och os.PathLike-instanser.
Den nya `` no_key`` -parametern för :meth:`.QuerySet.select_for_update() `, som stöds på PostgreSQL, gör det möjligt att förvärva svagare lås som inte blockerar skapandet av rader som refererar till låsta rader genom en främmande nyckel.
When() uttrycket tillåter nu användning av condition argumentet med lookups.
De nya attributen Index.include och UniqueConstraint.include gör det möjligt att skapa täckande index och täcka unika begränsningar på PostgreSQL 11+.
Det nya attributet UniqueConstraint.opclasses tillåter inställning av PostgreSQL-operatörsklasser.
Metoden QuerySet.update() respekterar nu order_by()-klausulen på MySQL och MariaDB.
FilteredRelation() stöder nu nästlade relationer.
Argumentet of i QuerySet.select_for_update() är nu tillåtet i MySQL 8.0.1+.
Value()-uttryck löser nu automatiskt upp sitt output_field till lämplig Field-underklass baserat på typen av dess tillhandahållna value för bool, bytes, float, int, str, datetime.date, datetime.datetime, datetime.time, datetime.timedelta, decimal.Decimal, och uuid.UUID instanser. Som en följd av detta kan upplösningen av ett output_field för databasfunktioner och kombinerade uttryck nu krascha med blandade typer när Value() används. Du måste uttryckligen ange output_field i sådana fall.
Den nya metoden QuerySet.alias() gör det möjligt att skapa återanvändbara alias för uttryck som inte behöver väljas men som används för filtrering, ordning eller som en del av komplexa uttryck.
Den nya Collate-funktionen gör det möjligt att filtrera och ordna efter angivna databaskollationer.
Argumentet field_name i QuerySet.in_bulk() accepterar nu distinkta fält om det bara finns ett fält angivet i QuerySet.distinct().
Den nya parametern tzinfo i databasfunktionerna TruncDate och TruncTime gör det möjligt att trunkera datatider i en specifik tidszon.
Det nya argumentet db_collation för CharField och TextField gör det möjligt att ange en databaskollation för fältet.
Lagt till databasfunktionen Random.
Aggregeringsfunktioner, F(), OuterRef() och andra uttryck tillåter nu användning av transformationer. Se använda-transformationer-i-uttryck för detaljer.
Det nya argumentet durable för atomic() garanterar att ändringar som görs i det atomiska blocket kommer att bekräftas om blocket avslutas utan fel. Ett nästlat atomiskt block som markerats som hållbart kommer att ge upphov till ett RuntimeError.
Lagt till databasfunktionen JSONObject.
Den nya django.core.paginator.Paginator.get_elided_page_range()-metoden gör det möjligt att generera ett sidintervall med några av värdena borttagna. Om det finns ett stort antal sidor kan detta vara till hjälp för att generera ett rimligt antal sidlänkar i en mall.
Svarshuvuden lagras nu i HttpResponse.headers. Detta kan användas istället för det ursprungliga diktliknande gränssnittet för HttpResponse-objekt. Båda gränssnitten kommer att fortsätta att stödjas. Se Ställa in rubrikfält för detaljer.
Den nya parametern headers i HttpResponse, SimpleTemplateResponse och TemplateResponse gör det möjligt att ställa in svar headers vid instansiering.
Inställningen SECRET_KEY kontrolleras nu för ett giltigt värde vid första åtkomst, i stället för när inställningarna laddas första gången. Detta gör det möjligt att köra hanteringskommandon som inte förlitar sig på SECRET_KEY utan att behöva ange ett värde. Som en konsekvens av detta kommer anrop av configure() utan att tillhandahålla en giltig SECRET_KEY och sedan fortsätta att komma åt ettings.SECRET_KEY nu att ge upphov till ett ImproperlyConfigured undantag.
De nya metoderna Signer.sign_object() och Signer.unsign_object() gör det möjligt att signera komplexa datastrukturer. Se Skydd av komplexa datastrukturer för mer information.
Dessutom blir signing.dumps() och loads() genvägar för TimestampSigner.sign_object() och unsign_object().
Signal.send_robust() loggar nu undantag.
floatformat mallfilter tillåter nu användning av suffixet g för att tvinga fram gruppering med THOUSAND_SEPARATOR för den aktiva locale.
Mallar som cachats med Cached template loaders laddas nu om korrekt under utveckling.
Objekt som tilldelats klassattribut i TestCase.setUpTestData() är nu isolerade för varje testmetod. Sådana objekt krävs nu för att stödja skapandet av djupa kopior med copy.deepcopy(). Tilldelning av objekt som inte stöder deepcopy() är föråldrad och kommer att tas bort i Django 4.1.
DiscoverRunner aktiverar nu faulthandler som standard. Detta kan inaktiveras genom att använda alternativet test --no-faulthandler.
DiscoverRunner och hanteringskommandot test kan nu spåra tidpunkter, inklusive databasinstallation och total körtid. Detta kan aktiveras genom att använda alternativet test --timing.
Client bevarar nu frågesträngen för begäran när 307- och 308-omdirigeringar följs.
Den nya metoden TestCase.captureOnCommitCallbacks() fångar upp callback-funktioner som skickas till transaction.on_commit() i en lista. Detta gör att du kan testa sådana callbacks utan att använda den långsammare TransactionTestCase.
TransactionTestCase.assertQuerysetEqual() stöder nu direkt jämförelse mot en annan queryset i stället för att begränsas till jämförelse mot en lista med strängrepresentationer av objekt när standardvärdet för argumentet transform används.
Den nya parametern depth i funktionerna django.utils.timesince.timesince() och django.utils.timesince.timeuntil() gör det möjligt att ange antalet intilliggande tidsenheter som ska returneras.
Inbyggda validerare inkluderar nu det angivna värdet i argumentet params i ett uppkommet ValidationError. Detta gör att anpassade felmeddelanden kan använda platshållaren %(value)s.
Jämlikhetsoperatorn ValidationError ignorerar nu ordningsföljden för messages och params.
I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.
Den nya egenskapen DatabaseFeatures.introspected_field_types ersätter dessa funktioner:
kan_introspektera_autofält
kan_introspektera_stort_integerfält
kan_introspektera_binärt_fält
kan_introspektera_decimal_fält
kan_introspektera_duration_fält
kan_introspektera_ip_adressfält
kan_introspektera_positivt_ heltalsfält
kan_introspektera_litet_ heltalsfält
kan_introspektera_tid_fält
introspected_big_auto_field_type
introspected_small_auto_field_type
introspected_boolean_field_type
Om du vill aktivera stöd för täckande index (Index.include) och täckande unika begränsningar (UniqueConstraint.include) anger du DatabaseFeatures.supports_covering_indexes till True.
Tredjeparts databasbackends måste implementera stöd för kolumndatabaskollationer på CharField och TextField eller sätta DatabaseFeatures.supports_collation_on_charfield och DatabaseFeatures.supports_collation_on_textfield till False. Om icke-deterministiska kollationer inte stöds, sätt upports_non_deterministic_collations till False.
DatabaseOperations.random_function_sql() tas bort till förmån för den nya Random databasfunktionen.
DatabaseOperations.date_trunc_sql() och DatabaseOperations.time_trunc_sql() tar nu det valfria argumentet tzname för att trunkera i en specifik tidszon.
DatabaseClient.runshell() hämtar nu argument och en valfri ordbok med miljövariabler till den underliggande kommandoradsklienten från DatabaseClient.settings_to_cmd_args_env()-metoden. Tredjeparts databasbackends måste implementera DatabaseClient.settings_to_cmd_args_env() eller åsidosätta DatabaseClient.runshell().
Tredjeparts databasbackends måste implementera stöd för funktionella index (Index.expressions) eller ange DatabaseFeatures.supports_expression_indexes till False. Om COLLATE inte är en del av CREATE INDEX-satsen, sätt DatabaseFeatures.collate_as_index_expression till True.
django.contrib.admin¶Pagineringslänkar i admin är nu 1-indexerade istället för 0-indexerade, dvs. frågesträngen för den första sidan är ?p=1 istället för ?p=0.
Den nya admin catch-all-vyn kommer att bryta URL-mönster som dirigeras efter admin-URL:erna och som matchar admin-URL-prefixet. Du kan antingen justera din URL-ordning eller, om nödvändigt, ställa in AdminSite.final_catch_all_view till False, vilket inaktiverar catch-all-vyn. Se Vad är nytt i Django 3.2 för mer information.
Minifierade JavaScript-filer ingår inte längre i admin. Om du vill att dessa filer ska minifieras bör du överväga att använda en tredjepartsapp eller ett externt byggverktyg. De minifierade JavaScript-filerna från vendored som paketeras med administratören (t.ex. jquery.min.js) ingår fortfarande.
ModelAdmin.prepopulated_fields tar inte längre bort engelska stoppord, som 'a' eller 'an'.
django.contrib.gis¶Stöd för PostGIS 2.2 har tagits bort.
Oracle-backend klonar nu polygoner (och geometrisamlingar som innehåller polygoner) innan de orienteras om och sparas i databasen. De muteras inte längre på plats. Du kanske märker detta om du använder polygonerna efter att en modell har sparats.
Uppströmsstöd för PostgreSQL 9.5 slutar i februari 2021. Django 3.2 stöder PostgreSQL 9.6 och högre.
Slutet på uppströmsstöd för MySQL 5.6 är april 2021. Django 3.2 stöder MySQL 5.7 och högre.
Django stöder nu tidszoner som inte är ”pytz”, till exempel Python 3.9+:s modul zoneinfo och dess bakport.
Den odokumenterade metoden SpatiaLiteOperations.proj4_version() har bytt namn till proj_version().
slugify() tar nu bort ledande och efterföljande bindestreck och understreck.
Mallfiltren intcomma och intword är inte längre beroende av inställningen USE_L10N.
Stöd för argon2-cffi < 19.1.0 har tagits bort.
Cache-nycklarna innehåller inte längre språket när internationalisering är inaktiverad (USE_I18N = False) och lokalisering är aktiverad (USE_L10N = True). Efter uppgradering till Django 3.2 i sådana konfigurationer kommer den första begäran till ett tidigare cachat värde att vara en cachemiss.
ForeignKey.validate() använder nu _base_manager istället för _default_manager för att kontrollera att relaterade instanser finns.
När en applikation definierar en AppConfig-underklass i en apps.py-undermodul, använder Django nu denna konfiguration automatiskt, även om den inte är aktiverad med default_app_config. Ställ in default = False i underklassen AppConfig om du behöver förhindra detta beteende. Se Vad är nytt i Django 3.2 för mer information.
Instansiering av en abstrakt modell ger nu upphov till TypeError.
Nyckelord-argument till setup_databases() är nu endast nyckelord.
Den odokumenterade funktionen django.utils.http.limited_parse_qsl() har tagits bort. Använd urllib.parse.parse_qsl() istället.
django.test.utils.TestContextDecorator använder nu addCleanup() så att upprensningar som registrerats i metoden setUp`() anropas innan TestContextDecorator.disable().
SessionMiddleware ger nu upphov till ett SessionInterrupted-undantag istället för SuspiciousOperation när en session förstörs i en samtidig begäran.
Jämlikhetsoperatorn django.db.models.Field skiljer nu korrekt mellan ärvda fältinstanser i olika modeller. Dessutom definieras nu ordningsföljden för sådana fält.
Den odokumenterade funktionen django.core.files.locks.lock() returnerar nu False om filen inte kan låsas, istället för att ge upphov till BlockingIOError.
Mekanismen för återställning av lösenord ogiltigförklarar nu tokens när användarens e-postadress ändras.
kommandot makemessages behandlar inte längre ogiltiga lokaliteter som anges med alternativet makemessages --locale, när de innehåller bindestreck ('-').
Formulärfältet django.contrib.auth.forms.ReadOnlyPasswordHashField är nu disabled` som standard. Därför krävs inte längre att UserChangeForm.clean_password() returnerar det ursprungliga värdet.
Cache-operationerna cache.get_many(), get_or_set(), has_key(), incr(), decr(), incr_version() och decr_version() hanterar nu korrekt None som lagras i cachen, på samma sätt som alla andra värden, istället för att bete sig som om nyckeln inte existerade.
På grund av en begränsning i python-memcached behålls det tidigare beteendet för den föråldrade MemcachedCache-backend.
Den lägsta versionen av SQLite som stöds har höjts från 3.8.3 till 3.9.0.
CookieStorage lagrar nu meddelanden i det format som överensstämmer med RFC 6265. Stöd för cookies som använder det gamla formatet finns kvar fram till Django 4.1.
Den lägsta versionen av asgiref som stöds har ökats från 3.2.10 till 3.3.2.
Att tilldela objekt som inte stöder skapandet av djupa kopior med copy.deepcopy() till klassattribut i TestCase.setUpTestData() är föråldrat.
Att använda ett booleanskt värde i BaseCommand.requires_system_checks är föråldrat. Använd '__all__' istället för True, och [] (en tom lista) istället för False.
Argumentet whitelist och attributet domain_whitelist i EmailValidator är föråldrade. Använd allowlist istället för whitelist, och domain_allowlist istället för domain_whitelist. Du kan behöva byta namn på whitelist i befintliga migreringar.
Applikationskonfigurationsvariabeln default_app_config är utdaterad, på grund av den nu automatiska AppConfig-upptäckten. Se Vad är nytt i Django 3.2 för mer information.
Att automatiskt anropa repr() på en queryset i TransactionTestCase.assertQuerysetEqual(), när den jämförs med strängvärden, är föråldrat. Om du behöver det tidigare beteendet, ställ uttryckligen in transform till repr.
Backend django.core.cache.backends.memcached.MemcachedCache är föråldrad eftersom python-memcached har vissa problem och verkar vara ounderhållen. Använd django.core.cache.backends.memcached.PyMemcacheCache eller django.core.cache.backends.memcached.PyLibMCCache istället.
Formatet på meddelanden som används av django.contrib.messages.storage.cookie.CookieStorage skiljer sig från det format som genereras av äldre versioner av Django. Stöd för det gamla formatet finns kvar fram till Django 4.1.
aug. 11, 2025