Django 5.0 versionsinformation¶
4 december 2023
Välkommen till Django 5.0!
Dessa versionsinformation 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 4.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 5.0 stöder Python 3.10, 3.11 och 3.12. Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.
Django 4.2.x-serien är den sista som stöder Python 3.8 och 3.9.
Stöd för tredjepartsbibliotek för äldre versioner av Django¶
Efter lanseringen av Django 5.0 föreslår vi att tredjepartsappförfattare släpper stödet för alla versioner av Django före 4.2. Vid den tidpunkten bör du kunna köra ditt pakets tester med python -Wd så att varningar om avskrivningar visas. Efter att du har åtgärdat varningarna bör din app vara kompatibel med Django 5.0.
Vad är nytt i Django 5.0¶
Facet-filter i administratörsgränssnittet¶
Facetträkningar visas nu för tillämpade filter i adminändringslistan när de växlas på via användargränssnittet. Detta beteende kan ändras via det nya attributet ModelAdmin.show_facets. För mer information se Facetter.
Förenklade mallar för rendering av formulärfält¶
Django 5.0 introducerar konceptet med en fältgrupp och fältgruppsmallar. Detta förenklar rendering av de relaterade elementen i ett Django-formulärsfält, såsom dess etikett, widget, hjälptext och fel.
Till exempel mallen nedan:
<form>
...
<div>
{{ form.name.label_tag }}
{% if form.name.help_text %}
<div class="helptext" id="{{ form.name.auto_id }}_helptext">
{{ form.name.help_text|safe }}
</div>
{% endif %}
{{ form.name.errors }}
{{ form.name }}
<div class="row">
<div class="col">
{{ form.email.label_tag }}
{% if form.email.help_text %}
<div class="helptext" id="{{ form.email.auto_id }}_helptext">
{{ form.email.help_text|safe }}
</div>
{% endif %}
{{ form.email.errors }}
{{ form.email }}
</div>
<div class="col">
{{ form.password.label_tag }}
{% if form.password.help_text %}
<div class="helptext" id="{{ form.password.auto_id }}_helptext">
{{ form.password.help_text|safe }}
</div>
{% endif %}
{{ form.password.errors }}
{{ form.password }}
</div>
</div>
</div>
...
</form>
Kan nu förenklas till:
<form>
...
<div>
{{ form.name.as_field_group }}
<div class="row">
<div class="col">{{ form.email.as_field_group }}</div>
<div class="col">{{ form.password.as_field_group }}</div>
</div>
</div>
...
</form>
as_field_group() återger fält med mallen "django/forms/field.html" som standard och kan anpassas per projekt, per fält eller per begäran. Se Återanvändbara mallar för fältgrupper.
Databasberäknade standardvärden¶
Den nya parametern Field.db_default anger ett databasberäknat standardvärde. Till exempel:
from django.db import models
from django.db.models.functions import Now, Pi
class MyModel(models.Model):
age = models.IntegerField(db_default=18)
created = models.DateTimeField(db_default=Now())
circumference = models.FloatField(db_default=2 * Pi())
Databasgenererat modellfält¶
Den nya GeneratedField gör det möjligt att skapa databasgenererade kolumner. Detta fält kan användas på alla stödda databasbackends för att skapa ett fält som alltid beräknas från andra fält. Till exempel:
from django.db import models
from django.db.models import F
class Square(models.Model):
side = models.IntegerField()
area = models.GeneratedField(
expression=F("side") * F("side"),
output_field=models.BigIntegerField(),
db_persist=True,
)
Fler alternativ för att deklarera fältval¶
Field.choices (för modellfält) och ChoiceField.choices (för formulärfält) ger mer flexibilitet när man deklarerar deras värden. I tidigare versioner av Django skulle choices antingen vara en lista med 2-tupler eller en Uppräkningstyper-underklass, men den senare krävde åtkomst till attributet .choices för att tillhandahålla värdena i den förväntade formen:
from django.db import models
Medal = models.TextChoices("Medal", "GOLD SILVER BRONZE")
SPORT_CHOICES = [
("Martial Arts", [("judo", "Judo"), ("karate", "Karate")]),
("Racket", [("badminton", "Badminton"), ("tennis", "Tennis")]),
("unknown", "Unknown"),
]
class Winner(models.Model):
name = models.CharField(...)
medal = models.CharField(..., choices=Medal.choices)
sport = models.CharField(..., choices=SPORT_CHOICES)
Django 5.0 lägger till stöd för att acceptera en mappning eller en callable istället för en iterable, och kräver inte längre att .choices används direkt för att expandera enumerationstyper:
from django.db import models
Medal = models.TextChoices("Medal", "GOLD SILVER BRONZE")
SPORT_CHOICES = { # Using a mapping instead of a list of 2-tuples.
"Martial Arts": {"judo": "Judo", "karate": "Karate"},
"Racket": {"badminton": "Badminton", "tennis": "Tennis"},
"unknown": "Unknown",
}
def get_scores():
return [(i, str(i)) for i in range(10)]
class Winner(models.Model):
name = models.CharField(...)
medal = models.CharField(..., choices=Medal) # Using `.choices` not required.
sport = models.CharField(..., choices=SPORT_CHOICES)
score = models.IntegerField(choices=get_scores) # A callable is allowed.
Under huven normaliseras de tillhandahållna valen till en lista med 2-tuples som den kanoniska formen när val-värdet uppdateras. För mer information, se modellfältets referens på choices.
Mindre funktioner¶
django.contrib.admin¶
Den nya metoden
AdminSite.get_log_entries()gör det möjligt att anpassa frågeuppsättningen för webbplatsens listade loggposter.Adminfiltren
django.contrib.admin.AllValuesFieldListFilter,ChoicesFieldListFilter,RelatedFieldListFilterochRelatedOnlyFieldListFilterhanterar nu flervärdiga frågeparametrar.XRegExpär uppgraderad från version 3.2.0 till 5.1.1.Den nya metoden
AdminSite.get_model_admin()returnerar en adminklass för den angivna modellklassen.Egenskaper i
ModelAdmin.list_displaystöder nu attributetboolean.jQuery uppgraderas från version 3.6.4 till 3.7.1.
django.contrib.auth¶
Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 600.000 till 720.000.
De nya asynkrona funktionerna tillhandahålls nu med prefixet
a:django.contrib.auth.aauthenticate(),aget_user(),alogin(),alogout()ochaupdate_session_auth_hash().AuthenticationMiddlewarelägger nu till en asynkron metodHttpRequest.auser`()som returnerar den inloggade användaren.Den nya asynkrona funktionen
django.contrib.auth.hashers.acheck_password()och metodenAbstractBaseUser.acheck_password()möjliggör asynkron kontroll av användarlösenord.
django.contrib.contenttypes¶
QuerySet.prefetch_related()stöder nu prefetchingGenericForeignKeymed icke-homogen uppsättning resultat.
django.contrib.gis¶
Den nya
ClosestPoint()funktionen returnerar en 2-dimensionell punkt på geometrin som är närmast en annan geometri.GIS-aggregat stöder nu argumentet
filter.Stöd för GDAL 3.7 och GEOS 3.12 har lagts till.
Den nya metoden
GEOSGeometry.equals_identical()möjliggör punktvis ekvivalenskontroll av geometrier.
django.contrib.messages¶
Den nya
MessagesTestMixin.assertMessages()assertion-metoden gör det möjligt att testamessagessom lagts till i enresponse.
django.contrib.postgres¶
Det nya attributet
violation_error_codeiExclusionConstraintgör det möjligt att anpassakodenförValidationErrorsom uppstår under modellvalidering.
Asynkrona vyer¶
Under ASGI hanteras nu
http.disconnect-händelser. Detta gör det möjligt för vyer att utföra all nödvändig upprensning om en klient kopplas bort innan svaret genereras. Se Hantering av frånkopplingar för mer information.
Dekoratörer¶
Följande dekoratorer stöder nu omslag av asynkrona vyfunktioner:
villkorlig_sida()xframe_options_deny()xframe_options_sameorigin()xframe_options_exempt()
Felrapportering¶
sensitive_variables()ochsensitive_post_parameters()kan nu användas med asynkrona funktioner.
Fil delning¶
File.open()skickar nu alla positionella (*args) och nyckelordsargument (**kwargs) till Pythons inbyggdaopen().
Formulär¶
Det nya argumentet
assume_schemeförURLFieldgör det möjligt att ange ett standard URL-schema.För att förbättra tillgängligheten har följande ändringar gjorts:
Formulärfält innehåller nu HTML-attributet
aria-describedbyför att skärmläsare ska kunna associera formulärfält med hjälptexten.Ogiltiga formulärfält innehåller nu HTML-attributet
aria-invalid="true".
Internationalisering¶
Support och översättningar för språket uigur finns nu tillgängliga.
Migreringar¶
Serialisering av funktioner som dekoreras med
functools.cache()ellerfunctools.lru_cache()stöds nu utan att man behöver skriva en egen serialiserare.
Modeller¶
Det nya argumentet
create_defaultsi metodernaQuerySet.update_or_create()ochQuerySet.aupdate_or_create()gör det möjligt att ange olika fältvärden för create-operationen.Det nya attributet
violation_error_codeförBaseConstraint,CheckConstraintochUniqueConstraintgör det möjligt att anpassacodeförValidationErrorsom uppstår under modellvalidering.Argumentet force_insert i
Model.save()tillåter nu att man anger en tupel av överordnade klasser som måste tvingas att infogas.metoderna
QuerySet.bulk_create()ochQuerySet.abulk_create()anger nu primärnyckeln för varje modellinstans när parameternupdate_conflictsär aktiverad (om databasen stöder det).Det nya attributet
UniqueConstraint.nulls_distinctgör det möjligt att anpassa behandlingen avNULL-värden på PostgreSQL 15+.De nya asynkrona genvägarna
aget_object_or_404()ochaget_list_or_404()gör det möjligt att hämta objekt asynkront.Den nya funktionen
aprefetch_related_objects()tillåter asynkron förhämtning av modellinstanser.QuerySet.aiterator()stöder nu tidigare anrop tillprefetch_related().På MariaDB 10.7+ skapas nu
UUIDFieldsomUUID-kolumn istället förCHAR(32)-kolumn. Se migreringsguiden ovan för mer information om Migrering av befintliga UUIDField på MariaDB 10.7+.Django stödjer nu oracledb version 1.3.2 eller högre. Stöd för
cx_Oracleär föråldrat från och med denna utgåva och kommer att tas bort i Django 6.0.
Sidindelning¶
Det nya argumentet
django.core.paginator.Paginator.error_messagesgör det möjligt att anpassa de felmeddelanden som tas upp avPaginator.page().
Signaler¶
De nya metoderna
Signal.asend()ochSignal.asend_robust()tillåter asynkron signalutskick. Signalmottagare kan vara synkrona eller asynkrona och kommer automatiskt att anpassas till rätt anropsstil.
Mallar¶
Tester¶
ClientochAsyncClienttillhandahåller nu asynkrona metoder med prefixeta:asession(),alogin(),aforce_login()ochalogout().AsyncClienthar nu stöd för parameternfollow.DiscoverRunnergör det nu möjligt att visa varaktigheten för de långsammaste testerna medtest --durations(tillgängligt på Python 3.12+).
Validerare¶
Det nya argumentet
offsetiStepValueValidatorgör det möjligt att ange en offset för giltiga värden.
Bakåtkompatibla ändringar i 5.0¶
Databas backend API¶
I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.
DatabaseFeatures.supports_expression_defaultsbör sättas tillFalseom databasen inte stöder användning av databasfunktioner som standardvärden.DatabaseFeatures.supports_default_keyword_in_insertbör sättas tillFalseom databasen inte stöder nyckelordetDEFAULTiINSERT-frågor.DatabaseFeatures.supports_default_keyword_in_bulk_insertbör sättas tillFalseom databasen inte stöder nyckelordetDEFAULTi bulkfrågorINSERT.
django.contrib.gis¶
Stöd för GDAL 2.2 och 2.3 har tagits bort.
Stöd för GEOS 3.6 och 3.7 har tagits bort.
django.contrib.sitemaps¶
Funktionen
django.contrib.sitemaps.ping_google()och hanteringskommandotping_googletas bort eftersom slutpunkten för Google Sitemaps ping är föråldrad och kommer att tas bort i januari 2024.Undantagsklassen
django.contrib.sitemaps.SitemapNotFoundtas bort.
Borttaget stöd för MySQL < 8.0.11¶
Stöd för tidigare utgåvor av MySQL 8.0.x-serien har tagits bort. Django 5.0 stöder MySQL 8.0.11 och högre.
Användning av create_defaults__exact kan nu krävas med QuerySet.update_or_create()¶
QuerySet.update_or_create() har nu stöd för parametern create_defaults. Som en följd av detta bör alla modeller som har ett fält med namnet create_defaults som används med en update_or_create() specificera fältet i uppslagningen med create_defaults__exact.
Migrering av befintliga UUIDField på MariaDB 10.7+¶
På MariaDB 10.7+ skapas nu UUIDField som UUID-kolumn snarare än CHAR(32)-kolumn. Som en följd av detta bör alla UUIDField som skapats i Django < 5.0 ersättas med en UUIDField underklass som stöds av CHAR(32):
class Char32UUIDField(models.UUIDField):
def db_type(self, connection):
return "char(32)"
def get_db_prep_value(self, value, connection, prepared=False):
value = super().get_db_prep_value(value, connection, prepared)
if value is not None:
value = value.hex
return value
Till exempel:
class MyModel(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4)
Bör bli:
class Char32UUIDField(models.UUIDField): ...
class MyModel(models.Model):
uuid = Char32UUIDField(primary_key=True, default=uuid.uuid4)
Om du kör kommandot makemigrations genereras en migrering som innehåller en ”AlterField”-operation utan undantag.
Diverse¶
Argumentet
instancei den odokumenterade metodenBaseModelFormSet.save_existing()har bytt namn tillobj.Den odokumenterade
django.contrib.admin.helpers.checkboxär borttagen.Heltalsfält valideras nu som 64-bitars heltal i SQLite för att matcha beteendet i
sqlite3.Det odokumenterade attributet
Query.annotation_select_maskändras från en uppsättning strängar till en ordnad lista med strängar.ImageField.update_dimension_fields()anropas inte längre på signalenpost_initomwidth_fieldochheight_fieldinte är inställda.Nowdatabasfunktion använder nuLOCALTIMESTAMPistället förCURRENT_TIMESTAMPpå Oracle.AdminSite.site_headeråterges nu i en<div>tagg istället för<h1>. Skärmläsaranvändare förlitar sig på rubrikelement för navigering på en sida. Att ha två<h1>-element var förvirrande och webbplatsrubriken var inte till hjälp eftersom den upprepas på alla sidor.För att förbättra tillgängligheten återges nu admins huvudinnehållsyta och rubrikinnehållsyta i taggarna
<main>och<header>istället för<div>.I databaser utan inbyggt stöd för SQL-operatorn
XORreturnerar nu^som operatorn exklusivt eller (XOR) rader som matchas av ett udda antal operander i stället för exakt en operand. Detta överensstämmer med beteendet i MySQL, MariaDB och Python.Den lägsta versionen av
asgirefsom stöds har ökats från 3.6.0 till 3.7.0.Den lägsta versionen av
Seleniumsom stöds har ökats från 3.8.0 till 4.8.0.Undantagen
AlreadyRegisteredochNotRegisteredflyttas fråndjango.contrib.admin.sitestilldjango.contrib.admin.exceptions.Den lägsta versionen av SQLite som stöds har ökats från 3.21.0 till 3.27.0.
Stöd för
cx_Oracle< 8.3 har tagits bort.Om SQL-frågor körs innan appregistret har fyllts på helt utlöses nu
RuntimeWarning.BadRequestuppstår för icke-UTF-8-kodade förfrågningar med innehållstypen application/x-www-form-urlencoded. Se RFC 1866 för mer information.Den minsta versionen av
coloramasom stöds har ökats till 0.4.6.Den minsta versionen av
docutilssom stöds har ökats till 0.19.Filtrering av querysets mot överflödiga heltalsvärden returnerar nu alltid en tom queryset. Som en följd av detta kan du behöva använda
ExpressionWrapper()för att explicit omsluta aritmetik mot heltalsfält i sådana fall.
Funktioner som inte längre är aktuella i 5.0¶
Diverse¶
Renderingarna
DjangoDivFormRendererochJinja2DivFormRendererför övergångsformer är föråldrade.Att skicka positionella argument
nameochviolation_error_messagetillBaseConstraintär föråldrat till förmån för argument med endast nyckelord.requestläggs till i signaturen förModelAdmin.lookup_allowed(). Stöd förModelAdminsubklasser som inte accepterar detta argument är föråldrat.Metoden
get_joining_columns()förForeignObjectochForeignObjectRelär föråldrad. Från och med Django 6.0 kommerdjango.db.models.sql.datastructures.Joininte längre att fallbacka tillget_joining_columns(). Underklasser bör implementeraget_joining_fields()istället.Metoden
ForeignObject.get_reverse_joining_columns()är föråldrad.The default scheme for
forms.URLFieldwill change from"http"to"https"in Django 6.0. SetFORMS_URLFIELD_ASSUME_HTTPStransitional setting toTrueto opt into assuming"https"during the Django 5.x release cycle.FORMS_URLFIELD_ASSUME_HTTPSövergångsinställning är föråldrad.Stöd för att anropa
format_html()utan att skicka args eller kwargs är föråldrat.Stöd för
cx_Oracleär borttaget till förmån för oracledb 1.3.2+ Python-drivrutin.DatabaseOperations.field_cast_sql()är föråldrad till förmån förDatabaseOperations.lookup_cast(). Från och med Django 6.0 kommerBuiltinLookup.process_lhs()inte längre att anropafield_cast_sql(). Tredjeparts databas backends bör implementeralookup_cast()istället.Metaklassen
django.db.models.enums.ChoicesMetahar bytt namn tillChoicesType.Metoden
Prefetch.get_current_queryset()är föråldrad.Metoden
get_prefetch_queryset()för relaterade hanterare och beskrivare är föråldrad. Från och med Django 6.0 kommerget_prefetcher()ochprefetch_related_objects()inte längre att fallbacka tillget_prefetch_queryset(). Underklasser bör implementeraget_prefetch_querysets()istället.
Funktioner borttagna i 5.0¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 5.0.
Se Funktioner som inte längre är aktuella i 4.0 för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.
Testinställningen
SERIALIZEhar tagits bort.Den odokumenterade modulen
django.utils.baseconvtas bort.Den odokumenterade modulen
django.utils.datetime_safetas bort.Standardvärdet för inställningen
USE_TZändras frånFalsetillTrue.Standardprotokollet för webbplatskartor som byggs upp utanför en begäran ändras från
'httptill'https.Argumentet
extra_testsförDiscoverRunner.build_suite()ochDiscoverRunner.run_tests()har tagits bort.Aggregaten
django.contrib.postgres.aggregates.ArrayAgg,JSONBAggochStringAggreturnerar inte längre[],[]respektive''när det inte finns några rader.Inställningen
USE_L10Nhar tagits bort.Övergångsinställningen
USE_DEPRECATED_PYTZhar tagits bort.Stöd för tidszoner av typen
pytzhar tagits bort.Argumentet
is_dsttas bort från:QuerySet.datetimes()django.utils.timezone.make_aware()django.db.models.functions.Trunc()django.db.models.functions.TruncSecond()django.db.models.functions.TruncMinute()django.db.models.functions.TruncHour()django.db.models.functions.TruncDay()django.db.models.functions.TruncWeek()django.db.models.functions.TruncMonth()django.db.models.functions.TruncQuarter()django.db.models.functions.TruncYear()
Klasserna
django.contrib.gis.admin.GeoModelAdminochOSMGeoAdmintas bort.Den odokumenterade metoden
BaseForm._html_output()har tagits bort.Möjligheten att returnera en
str, snarare än enSafeString, vid rendering av enErrorDictochErrorListhar tagits bort.
Se Funktioner som inte längre är aktuella i 4.1 för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.
Metoden
SitemapIndexItem.__str__()har tagits bort.Övergångsinställningen
CSRF_COOKIE_MASKEDtas bort.Argumentet
nameidjango.utils.functional.cached_property()tas bort.Argumentet
opclassesidjango.contrib.postgres.constraints.ExclusionConstrainthar tagits bort.Den odokumenterade möjligheten att skicka
errors=NonetillSimpleTestCase.assertFormError()ochassertFormsetError()har tagits bort.django.contrib.sessions.serializers.PickleSerializerhar tagits bort.Det är inte längre tillåtet att använda
QuerySet.iterator()på en queryset som hämtar relaterade objekt utan att ange argumentetchunk_size.Det är inte längre tillåtet att skicka osparade modellinstanser till relaterade filter.
created=Truekrävs i signaturen förRemoteUserBackend.configure_user()subklasser.Stöd för utloggning via
GET-förfrågningar idjango.contrib.auth.views.LogoutViewochdjango.contrib.auth.views.logout_then_login()tas bort.Aliaset
django.utils.timezone.utctilldatetime.timezone.utchar tagits bort.Det är inte längre tillåtet att skicka ett svarsobjekt och ett namn på ett formulär/formset till
SimpleTestCase.assertFormError()ochassertFormSetError().django.contrib.gis.admin.OpenLayersWidgettas bort.
django.contrib.auth.hashers.CryptPasswordHashertas bort.
Mallarna
"django/forms/default.html"och"django/forms/formsets/default.html"tas bort.Standardrenderingsstilen för formulär och formset ändras till div-baserad.
Det är inte längre tillåtet att skicka
nulls_first=Falseellernulls_last=Falsetill metodernaExpression.asc()ochExpression.desc()och uttrycketOrderBy.