Django 5.1 versionsinformation¶
7 augusti 2024
Välkommen till Django 5.1!
Dessa versionsinformation täcker nya funktioner, samt några bakåtkompatibla förändringar som du bör vara medveten om när du uppgraderar från Django 5.0 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 5.1 stöder Python 3.10, 3.11, 3.12 och 3.13 (från och med 5.1.3). Vi rekommenderar starkt och stöder endast officiellt den senaste utgåvan av varje serie.
Vad är nytt i Django 5.1¶
{% frågestring %} mall tagg¶
Django 5.1 introducerar {% querystring %}, vilket förenklar modifieringen av frågeparametrar i webbadresser, vilket gör det lättare att generera länkar som behåller befintliga frågeparametrar samtidigt som de lägger till eller ändrar specifika parametrar.
Det kan t.ex. vara besvärligt att navigera mellan paginering och frågesträngar i mallar. Tänk på det här mallfragmentet som dynamiskt genererar en URL för att navigera till nästa sida i en paginerad vy:
{# Linebreaks added for readability, this should be one, long line. #}
<a href="?{% for key, values in request.GET.iterlists %}
{% if key != "page" %}
{% for value in values %}
{{ key }}={{ value }}&
{% endfor %}
{% endif %}
{% endfor %}page={{ page.next_page_number }}">Next page</a>
När du byter till att använda denna nya malltagg blir ovanstående magiskt:
<a href="{% querystring page=page.next_page_number %}">Next page</a>
PostgreSQL anslutningspooler¶
Django 5.1 introducerar också connection pool stöd för PostgreSQL. Eftersom tiden för att upprätta en ny anslutning kan vara relativt lång kan det minska latensen att hålla anslutningar öppna.
För att använda en anslutningspool med psycopg kan du ställa in alternativet "pool" i OPTIONS till att vara en dict som ska skickas till ConnectionPool, eller till True för att använda ConnectionPool standardvärden:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
# ...
"OPTIONS": {
"pool": {
"min_size": 2,
"max_size": 4,
"timeout": 10,
}
},
},
}
Middleware kräver autentisering som standard¶
Den nya LoginRequiredMiddleware omdirigerar alla oautentiserade förfrågningar till en inloggningssida. Vyer kan tillåta oautentiserade förfrågningar genom att använda den nya login_not_required() dekoratorn.
LoginRequiredMiddleware respekterar värdena login_url och redirect_field_name som anges via login_required()-dekoratorn, men stöder inte inställning av login_url eller redirect_field_name via LoginRequiredMixin.
För att aktivera detta, lägg till "django.contrib.auth.middleware.LoginRequiredMiddleware" till din MIDDLEWARE inställning.
Mindre funktioner¶
django.contrib.admin¶
ModelAdmin.list_displaystöder nu användning av__-uppslagningar för att lista fält från relaterade modeller.
django.contrib.auth¶
Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 720.000 till 870.000.
Standardvärdet för
parallelismförScryptPasswordHasherhar ökats från 1 till 5 för att följa OWASP:s rekommendationer.Den nya
AdminUserCreationFormoch den befintligaAdminPasswordChangeFormstöder nu inaktivering av lösenordsbaserad autentisering genom att ange ett oanvändbart lösenord när formuläret sparas. Detta är nu tillgängligt i admin när du besöker sidorna för skapande av användare och lösenordsändring.dekoratorerna
login_required(),permission_required()ochuser_passes_test()stöder nu omslag av asynkrona vyfunktioner.ReadOnlyPasswordHashWidgetinnehåller nu en knapp för att återställa användarens lösenord, som ersätter den länk som tidigare var inbäddad iReadOnlyPasswordHashFieldhjälptext, vilket förbättrar den övergripande tillgängligheten förUserChangeForm.
django.contrib.gis¶
BoundingCirclestöds nu på SpatiaLite 5.1+.Collectstöds nu på MySQL 8.0.24+.GeoIP2tillåter nu frågor som använderipaddress.IPv4Addresselleripaddress.IPv6Addressobjekt.GeoIP2.country()exponerar nu värdenacontinent_code,continent_nameochis_in_european_union.GeoIP2.city()exponerar nu värdenaaccuracy_radiusochregion_name. Dessutom exponeras värdenadma_codeochregionnu sommetro_codeochregion_code, men de tidigare nycklarna behålls också för bakåtkompatibilitet.Areahar nu stöd för enhetenha.Det nya attributet
OGRGeometry.is_3dgör det möjligt att kontrollera om en geometri har enZkoordinatdimension.Den nya metoden
OGRGeometry.set_3d()gör det möjligt att lägga till och ta bort koordinatdimensionenZ.OGRGeometry,Point,LineString,PolygonochGeometryCollectionoch dess underklasser stöder nu uppmätta geometrier via de nya egenskapernaOGRGeometry.is_measuredochm, och metodenOGRGeometry.set_measured().OGRGeometry.centroidär nu tillgänglig för alla geometrityper som stöds.funktionerna
FromWKB()ochFromWKT()stöder nu det valfria argumentetsrid(utom för Oracle där det ignoreras).
django.contrib.postgres¶
BTreeIndexhar nu stöd för parameterndeduplicate_items.
django.contrib.sessions¶
django.contrib.sessions.backends.cached_db.SessionStorehanterar nu undantag när sessionsinformation lagras i cacheminnet, och loggar korrekta felmeddelanden med deras traceback via den nyligen tillagda sessions logger.django.contrib.sessions.backends.base.SessionBaseoch alla inbyggda sessionsmotorer tillhandahåller nu asynkrona API. De nya asynkrona metoderna har alla namn med prefixeta, t.ex.aget(),akeys()elleracycle_key().
Databas backends¶
alternativet
"init_command"stöds nu iOPTIONSpå SQLite för att möjliggöra specificering av pragma options att ställa in vid anslutning.alternativet
"transaction_mode"stöds nu iOPTIONSpå SQLite för att möjliggöra specificering av Transaktionsbeteende.alternativet `` ”pool” `` stöds nu i
OPTIONSpå PostgreSQL för att tillåta användning av connection pools.
Felrapportering¶
För att förbättra tillgängligheten använder de tekniska 404- och 500-felsidorna nu HTML-landmärkeselement för sidhuvud, sidfot och huvudinnehåll.
Fil delning¶
Parametern
allow_overwriteiFileSystemStoragetillåter nu att nya filer sparas över befintliga.
Formulär¶
För att förbättra tillgängligheten och göra det möjligt för skärmläsare att associera fältuppsättningar med hjälptexten innehåller formulärfältuppsättningen nu HTML-attributet ”aria-describedby”.
Kommandon för hantering¶
Kommandot
makemigrationsvisar nu meningsfulla symboler för varje operation för att markeraoperation categories.
Migreringar¶
Det nya attributet
Operation.categorygör det möjligt att ange enoperationskategorisom används avmakemigrationsför att visa en meningsfull symbol för operationen.
Modeller¶
QuerySet.explain()stöder nu alternativet `` generic_plan`` på PostgreSQL 16+.RowRangeaccepterar nu positiva heltal förstart-argumentet och negativa heltal förslut-argumentet.Det nya argumentet
exclusioniRowRangeochValueRangegör det möjligt att utesluta rader, grupper och band från fönsterramarna.QuerySet.order_by()stöder nu beställning av annotationstransformationer somJSONObject-nycklar ochArrayAgg-index.F()ochOuterRef()uttryck som ger utCharField,EmailField,SlugField,URLField,TextField, ellerArrayFieldkan nu sliced.Det nya argumentet
from_querysetiModel.refresh_from_db()ochModel.arefresh_from_db()gör det möjligt att anpassa den queryset som används för att ladda om en modells värde. Detta kan användas för att låsa raden innan den laddas om eller för att välja relaterade objekt.Det nya attributet
Expression.constraint_validation_compatiblegör det möjligt att ange att uttrycket ska ignoreras under en constraint-validering.
Mallar¶
Anpassade taggar kan nu ange extra data på objektet
Parsersom senare kommer att göras tillgängliga på instansenTemplate. Sådana data kan användas av t.ex. mallladdaren eller andra mallklienter.Template engines implementerar nu en
check()-metod som redan är registrerad med check-ramverket.
Tester¶
assertContains(),assertNotContains()ochassertInHTML()lägger nu till höstackar i felmeddelanden för påståenden.Klasserna
RequestFactory,AsyncRequestFactory,ClientochAsyncClienthar nu stöd för parameternquery_params, som accepterar en ordbok med nycklar och värden för frågesträngar. Detta gör det lättare att ställa in frågesträngar på alla HTTP-metoder.self.client.post("/items/1", query_params={"action": "delete"}) await self.async_client.post("/items/1", query_params={"action": "delete"})
Den nya
SimpleTestCase.assertNotInHTML()-assertionen gör det möjligt att testa att ett HTML-fragment inte finns i den givna HTML-höbacken.För att upprätthålla testisolering är databasanslutningar i trådar inte längre tillåtna i
SimpleTestCase.
Validerare¶
Den nya
DomainNameValidatorvaliderar domännamn, inklusive internationaliserade domännamn. Den nya funktionenvalidate_domain_name()returnerar en instans avDomainNameValidator.
Bakåtkompatibla ändringar i 5.1¶
django.contrib.gis¶
Stöd för PostGIS 2.5 har tagits bort.
Stöd för PROJ < 6 har tagits bort.
Stöd för GDAL 2.4 har tagits bort.
GeoIP2öppnar inte längre både stads- och landsdatabaser när en katalogväg anges, utan föredrar stadsdatabasen om den är tillgänglig. Landsdatabasen är en delmängd av stadsdatabasen och båda behövs normalt inte. Om du behöver använda landsdatabasen när den finns i samma katalog som stadsdatabasen, ska du uttryckligen skicka sökvägen till landsdatabasen till konstruktören.
Upphört stöd för MariaDB 10.4¶
Uppströmsstöd för MariaDB 10.4 upphör i juni 2024. Django 5.1 stöder MariaDB 10.5 och senare.
Slopat stöd för PostgreSQL 12¶
Uppströmsstöd för PostgreSQL 12 slutar i november 2024. Django 5.1 stöder PostgreSQL 13 och högre.
Diverse¶
För att förbättra tillgängligheten återges nu administratörens filter för ändringslistan i en tagg av typen
<nav>istället för<div>.För att förbättra tillgängligheten återges admins sidfot nu i en ”<footer>”-tagg i stället för en ”<div>”-tagg, och den har också flyttats under ”<div id=”main”>”-elementet.
För att förbättra tillgängligheten innehåller den expanderbara widget som används för
ModelAdmin.fieldsetsochInlineModelAdmin.fieldsets, när fieldsetet har ett namn och använder klassencollapse, nu elementen<details>och<summary>.JavaScript-filen
collapse.jstas bort eftersom den inte längre behövs på Django-adminsidan.SimpleTestCase.assertURLEqual()ochassertInHTML()lägger nu till": "tillmsg_prefix. Detta överensstämmer med beteendet hos andra påståenden.django.utils.text.Truncatorused bytruncatechars_htmlandtruncatewords_htmltemplate filters now useshtml.parser.HTMLParsersubclasses. This results in a more robust and faster operation, but there may be small differences in the output.Den odokumenterade funktionen
django.urls.converters.get_converter()har tagits bort.Den lägsta versionen av SQLite som stöds har ökats från 3.27.0 till 3.31.0.
FileFieldger nu upphov till ettFieldErrornär man sparar en fil utannamn.ImageField.update_dimension_fields(force=True)anropas inte längre efter att bilden har sparats i lagringsutrymmet. Om din lagringsbackend ändrar storlek på bilder kommerwidth_fieldochheight_fieldinte att matcha bildens bredd och höjd.Den lägsta versionen av
asgirefsom stöds har ökats från 3.7.0 till 3.8.1.För att förbättra prestandan använder admin-åtgärden
delete_selectednuQuerySet.bulk_create()när fleraLogEntry-objekt skapas. Som ett resultat skickas inte signalernapre_saveochpost_saveförLogEntrynär flera objekt tas bort via denna admin-åtgärd.
Funktioner som inte längre är aktuella i 5.1¶
Diverse¶
Metoderna
ModelAdmin.log_deletion()ochLogEntryManager.log_action()är föråldrade. Underklasser bör implementeraModelAdmin.log_deletions()ochLogEntryManager.log_actions()istället.Den odokumenterade funktionen
django.utils.itercompat.is_iterable()och modulendjango.utils.itercompatär föråldrade. Användisinstance(..., collections.abc.Iterable)istället.Metoden
django.contrib.gis.geoip2.GeoIP2.coords()är föråldrad. Använddjango.contrib.gis.geoip2.GeoIP2.lon_lat()istället.Metoden
django.contrib.gis.geoip2.GeoIP2.open()är föråldrad. AnvändGeoIP2-konstruktören istället.Att skicka positionella argument till
Model.save()ochModel.asave()är föråldrat till förmån för argument som endast innehåller nyckelord.Inställningen
django.contrib.gis.gdal.OGRGeometry.coord_dimär föråldrad. Användset_3d()istället.Att åsidosätta befintliga omvandlare med
django.urls.register_converter()är föråldrat.Nyckelordsargumentet
checkiCheckConstraintär avfört till förmån förcondition.Den odokumenterade egenskapen
OS_OPEN_FLAGSiFileSystemStorageär föråldrad. För att tillåta överskrivning av filer i lagring, ställ in det nyaallow_overwrite-alternativet tillTrueistället.Metoden
get_cache_name()iFieldCacheMixinär utfasad till förmån för den cachade egenskapencache_name.
Funktioner borttagna i 5.1¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 5.1.
Se Funktioner som inte längre är aktuella i 4.2 för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.
Metoden
BaseUserManager.make_random_password()har tagits bort.Modellens alternativ
Meta.index_togethertas bort.Mallfiltret
length_ishar tagits bort.django.contrib.auth.hashers.SHA1PasswordHasher,django.contrib.auth.hashers.UnsaltedSHA1PasswordHasherochdjango.contrib.auth.hashers.UnsaltedMD5PasswordHashertas bort.Modellerna
django.contrib.postgres.fields.CICharField,django.contrib.postgres.fields.CIEmailFieldochdjango.contrib.postgres.fields.CITextFieldtas bort, förutom för stöd i historiska migreringar.Mixinen
django.contrib.postgres.fields.CITextär borttagen.Attributen
map_widthochmap_heightförBaseGeometryWidgettas bort.Metoden
SimpleTestCase.assertFormsetError()har tagits bort.Metoden
TransactionTestCase.assertQuerysetEqual()har tagits bort.Stöd för att skicka kodade JSON-stränglitteraler till
JSONFieldoch tillhörande uppslagningar och uttryck har tagits bort.Stöd för att skicka positionella argument till
SignerochTimestampSignerhar tagits bort.Inställningarna
DEFAULT_FILE_STORAGEochSTATICFILES_STORAGEtas bort.Funktionen
django.core.files.storage.get_storage_class()har tagits bort.