Django 3.1 release notes¶
4 augusti 2020
Välkommen till Django 3.1!
Dessa release notes täcker de nya funktionerna, samt några bakåtkompatibla förändringar som du vill vara medveten om när du uppgraderar från Django 3.0 eller tidigare. Vi har ta bort några funktioner som har nått slutet av sin utfasningscykel, och vi har startat utfasningsprocessen för några funktioner.
Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.
Kompatibilitet med Python¶
Django 3.1 stöder Python 3.6, 3.7, 3.8 och 3.9 (från och med 3.1.3). Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.
Vad är nytt i Django 3.1¶
Asynkrona vyer och stöd för middleware¶
Django stöder nu en helt asynkron sökväg, inklusive:
För att komma igång med asynkrona vyer måste du deklarera en vy med hjälp av async def
:
async def my_view(request):
await asyncio.sleep(0.5)
return HttpResponse("Hello, async world!")
Alla asynkrona funktioner stöds oavsett om du kör i WSGI- eller ASGI-läge. Det blir dock prestandaförluster om du använder asynkron kod i WSGI-läge. Du kan läsa mer om detaljerna i dokumentationen Asynkront stöd.
Det står dig fritt att blanda asynkrona och synkroniserade vyer, middleware och tester så mycket du vill. Django kommer att se till att du alltid hamnar i rätt exekveringskontext. Vi förväntar oss att de flesta projekt kommer att hålla majoriteten av sina vyer synkrona och bara ha ett fåtal utvalda som körs i async-läge - men det är helt ditt val.
Djangos ORM, cache-lager och andra delar av koden som gör långvariga nätverksanrop har ännu inte stöd för asynkron åtkomst. Vi förväntar oss att lägga till stöd för dem i kommande utgåvor. Asynkrona vyer är idealiska, men om du gör många API- eller HTTP-anrop i din vy kan du nu göra alla dessa HTTP-anrop parallellt för att avsevärt påskynda vyns exekvering.
Asynkront stöd bör vara helt bakåtkompatibelt och vi har försökt se till att det inte har några hastighetsregressioner för din befintliga synkrona kod. Det bör inte ha någon märkbar effekt på några befintliga Django-projekt.
JSONField för alla stödda databasbackends¶
Django innehåller nu models.JSONField
och forms.JSONField
som kan användas på alla stödda databasbackends. Båda fälten stöder användningen av anpassade JSON-kodare och -avkodare. Modellfältet stöder introspektion, lookups och transformationer som tidigare endast var PostgreSQL:
from django.db import models
class ContactInfo(models.Model):
data = models.JSONField()
ContactInfo.objects.create(
data={
"name": "John",
"cities": ["London", "Cambridge"],
"pets": {"dogs": ["Rufus", "Meg"]},
}
)
ContactInfo.objects.filter(
data__name="John",
data__pets__has_key="dogs",
data__cities__contains="London",
).delete()
Om ditt projekt använder django.contrib.postgres.fields.JSONField
, plus relaterade formulärfält och transformationer, bör du anpassa dig för att använda de nya fälten och generera och tillämpa en databasmigrering. För närvarande finns de gamla fälten och transformationerna kvar som en referens till de nya och är :ref:deprecated as of this release <deprecated-jsonfield>
.
DEFAULT_HASHING_ALGORITHM
inställningar¶
Den nya övergångsinställningen DEFAULT_HASHING_ALGORITHM
gör det möjligt att ange standardhashingalgoritmen som ska användas för kodning av cookies, lösenordsåterställningstoken på administratörssidan, användarsessioner och signaturer som skapats av django.core.signing.Signer
och django.core.signing.dumps()
.
Stöd för SHA-256 lades till i Django 3.1. Om du uppgraderar flera instanser av samma projekt till Django 3.1 bör du ställa in DEFAULT_HASHING_ALGORITHM
till 'sha1'
under övergången, för att möjliggöra kompatibilitet med de äldre versionerna av Django. Observera att detta kräver Django 3.1.1+. När övergången till 3.1 är klar kan du sluta åsidosätta DEFAULT_HASHING_ALGORITHM
.
Den här inställningen är inte aktuell från och med den här utgåvan, eftersom stöd för tokens, cookies, sessioner och signaturer som använder SHA-1-algoritmen kommer att tas bort i Django 4.0.
Mindre funktioner¶
django.contrib.admin
¶
Den nya
django.contrib.admin.EmptyFieldListFilter
förModelAdmin.list_filter
tillåter filtrering på tomma värden (tomma strängar och nollor) i admin-ändringslistvyn.Filter i det högra sidofältet i vyn för adminändringslistan innehåller nu en länk för att rensa alla filter.
Administratören har nu ett sidofält på större skärmar för enklare navigering. Det är aktiverat som standard men kan avaktiveras genom att använda en anpassad
AdminSite
och ställa inAdminSite.enable_nav_sidebar
tillFalse
.Rendering av sidofältet kräver tillgång till den aktuella begäran för att ställa in CSS- och ARIA-rollförmåner. Detta kräver användning av
'django.template.context_processors.request'
i alternativet'context_processors'
iOPTIONS
.Initialt tomma
extra
inlines kan nu tas bort, på samma sätt som dynamiskt skapade.XRegExp
är uppgraderad från version 2.0.0 till 3.2.0.jQuery uppgraderas från version 3.4.1 till 3.5.1.
Select2-biblioteket har uppgraderats från version 4.0.7 till 4.0.13.
django.contrib.auth
¶
Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 180.000 till 216.000.
Den nya inställningen
PASSWORD_RESET_TIMEOUT
gör det möjligt att definiera antalet sekunder som en länk för återställning av lösenord är giltig. Detta uppmuntras istället för den föråldrade inställningenPASSWORD_RESET_TIMEOUT_DAYS
, som kommer att tas bort i Django 4.0.Mekanismen för återställning av lösenord använder nu hash-algoritmen SHA-256. Stöd för tokens som använder den gamla hash-algoritmen finns kvar till Django 4.0.
AbstractBaseUser.get_session_auth_hash()
använder nu SHA-256 hashingalgoritmen. Stöd för användarsessioner som använder den gamla hash-algoritmen finns kvar fram till Django 4.0.
django.contrib.contenttypes
¶
Det nya alternativet
remove_stale_contenttypes --include-stale-apps
gör det möjligt att ta bort inaktuella innehållstyper från tidigare installerade appar som har tagits bort frånINSTALLED_APPS
.
django.contrib.gis
¶
relate
lookup stöds nu på MariaDB.Lagt till egenskapen
LinearRing.is_counterclockwise
.AsGeoJSON
stöds nu av Oracle.Stöd för PostGIS 3 och GDAL 3 har lagts till.
django.contrib.humanize
¶
intword
mallfilter stöder nu negativa heltal.
django.contrib.postgres
¶
Den nya
BloomIndex
-klassen gör det möjligt att skapabloom
-index i databasen. Den nyaBloomExtension
-migreringsoperationen installerarbloom
-tillägget för att lägga till stöd för detta index.get_FOO_display()
stöder nuArrayField
ochRangeField
.De nya uppslagen
rangefield.lower_inc
,rangefield.lower_inf
,rangefield.upper_inc
ochrangefield.upper_inf
gör det möjligt att frågaRangeField
efter en bunden typ.rangefield.contained_by
stöder nuSmallAutoField
,AutoField
,BigAutoField
,SmallIntegerField
ochDecimalField
.SearchQuery
stöder nu söktypen'websearch'
på PostgreSQL 11+.SearchQuery.value
har nu stöd för frågeuttryck.Den nya
SearchHeadline
-klassen gör det möjligt att markera sökresultat.search
lookup har nu stöd för frågeuttryck.Den nya parametern
cover_density
iSearchRank
tillåter rangordning efter täckningsdensitet.Den nya parametern
normalization
iSearchRank
tillåter normalisering av rankning.Det nya attributet
ExclusionConstraint.deferrable
gör det möjligt att skapa uppskjutbara uteslutningsbegränsningar.
django.contrib.sessions
¶
Inställningen
SESSION_COOKIE_SAMESITE
tillåter nu värdet'None'
(sträng) för att uttryckligen ange att cookien skickas med alla förfrågningar på samma webbplats och mellan olika webbplatser.
django.contrib.staticfiles
¶
Inställningen
STATICFILES_DIRS
stöder nupathlib.Path
.
Cache¶
Dekoratorn
cache_control()
och metodenpatch_cache_control()
stöder nu flera fältnamn i direktivetno-cache
för rubrikenCache-Control
, enligt RFC 7234 Section 5.2.2.2.delete()
returnerar nuTrue
om nyckeln har raderats framgångsrikt,False
annars.
CSRF¶
Inställningen
CSRF_COOKIE_SAMESITE
tillåter nu värdet'None'
(sträng) för att uttryckligen ange att cookien skickas med alla förfrågningar på samma webbplats och mellan olika webbplatser.
E-postadress¶
Inställningen
EMAIL_FILE_PATH
, som används av file email backend, har nu stöd förpathlib.Path
.
Felrapportering¶
django.views.debug.SafeExceptionReporterFilter
filtrerar nu känsliga värden frånrequest.META
i undantagsrapporter.De nya attributen
SafeExceptionReporterFilter.cleansed_substitute
ochSafeExceptionReporterFilter.hidden_settings
gör det möjligt att anpassa känsliga inställningar och filtrering avrequest.META
i undantagsrapporter.Den tekniska 404-felsökningsvyn respekterar nu
DEFAULT_EXCEPTION_REPORTER_FILTER
vid tillämpning av inställningsfiltrering.Den nya :inställningen:`DEFAULT_EXCEPTION_REPORTER` gör det möjligt att tillhandahålla en
django.views.debug.ExceptionReporter
-underklass för att anpassa genereringen av undantagsrapporter. Se Anpassade felrapporter för detaljer.
Fil delning¶
metoden
FileSystemStorage.save()
har nu stöd förpathlib.Path
.FileField
ochImageField
accepterar nu en callable förstorage
. Detta gör att du kan ändra den använda lagringen vid körning, till exempel genom att välja olika lagring för olika miljöer.
Formulär¶
ModelChoiceIterator
, som används avModelChoiceField
ochModelMultipleChoiceField
, använder nuModelChoiceIteratorValue
som kan användas av widgets för att komma åt modellinstanser. Se Iteration av relationsval för detaljer.django.forms.DateTimeField
accepterar nu datum i en delmängd av ISO 8601 datetime-format, inklusive valfri tidszon, t.ex.2019-10-10T06:47
,2019-10-10T06:47:23+04:00
, eller2019-10-10T06:47:23Z
. Tidszonen kommer alltid att behållas om den anges, och tidszonmedvetna datatider returneras även omUSE_TZ
ärFalse
.Dessutom använder
DateTimeField
nuDATE_INPUT_FORMATS
i tillägg tillDATETIME_INPUT_FORMATS
när fältinmatning konverteras till ettdatetime
-värde.MultiWidget.widgets
accepterar nu en ordbok som gör det möjligt att anpassa attribut för subwidgetsnamn
.Den nya egenskapen
BoundField.widget_type
kan användas för att dynamiskt justera formulärrendering baserat på widget-typen.
Internationalisering¶
Inställningen
LANGUAGE_COOKIE_SAMESITE
tillåter nu värdet'None'
(sträng) för att uttryckligen ange att cookien skickas med alla förfrågningar på samma webbplats och mellan olika webbplatser.Stöd för och översättningar av algerisk arabiska, igbo, kirgiziska, tadzjikiska och turkmenska har lagts till.
Kommandon för hantering¶
Det nya alternativet
check --database
gör det möjligt att ange databasalias för att köra systemkontrollernadatabase
. Tidigare aktiverades dessa kontroller för alla konfigureradeDATABASER
genom att skicka taggendatabase
till kommandot.Det nya alternativet
migrate --check
gör att kommandot avslutas med en status som inte är noll när oanvända migreringar upptäcks.Det nya argumentet
returncode
förCommandError
gör det möjligt att anpassa avslutningsstatusen för hanteringskommandon.Det nya alternativet
dbshell -- ARGUMENTS
gör det möjligt att skicka extra argument till kommandoradsklienten för databasen.Kommandona
flush
ochsqlflush
innehåller nu SQL för att återställa sekvenser på SQLite.
Modeller¶
Den nya funktionen
ExtractIsoWeekDay
extraherar ISO-8601-veckodagar frånDateField
ochDateTimeField
, och den nyaiso_week_day
gör det möjligt att söka efter en ISO-8601-veckodag.QuerySet.explain()
stöder nu:TREE
-format på MySQL 8.0.16+,alternativet
analyze
på MySQL 8.0.18+ och MariaDB.
Lagt till
PositiveBigIntegerField
som fungerar ungefär som enPositiveIntegerField
förutom att den bara tillåter värden under en viss (databasberoende) gräns. Värden från0
till9223372036854775807
är säkra i alla databaser som stöds av Django.Det nya
RESTRICT
-alternativet föron_delete
-argumentet förForeignKey
ochOneToOneField
efterliknar beteendet hos SQL-begränsningenON DELETE RESTRICT
.CheckConstraint.check
stöder nu booleska uttryck.Metoderna
RelatedManager.add()
,create()
ochset()
accepterar nu anropsbara objekt som värden i argumentetthrough_defaults
.Den nya parametern
is_dst
iQuerySet.datetimes()
bestämmer behandlingen av icke-existerande och tvetydiga datatider.Den nya
F
expressionbitxor()
metoden tillåter :ref:``bitvis XOR operation <using-f-expressions-in-filters>`.QuerySet.bulk_create()
ställer nu in primärnyckeln på objekt när MariaDB 10.5+ används.Metoden
DatabaseOperations.sql_flush()
genererar nu mer effektiv SQL på MySQL genom att användaDELETE
istället förTRUNCATE
-satser för tabeller som inte kräver återställning av sekvenser.SQLite-funktioner är nu markerade som
deterministic
på Python 3.8+. Detta gör det möjligt att använda dem i check constraints och partiella index.Det nya attributet
UniqueConstraint.deferrable
gör det möjligt att skapa uppskjutbara unika begränsningar.
Sidindelning¶
Paginator
kan nu itereras över för att få fram dess sidor.
Förfrågningar och svar¶
Om
ALLOWED_HOSTS
är tom ochDEBUG=True
, tillåts nu subdomäner av localhost iHost
-huvudet, t.ex.static.localhost
.HttpResponse.set_cookie()
ochHttpResponse.set_signed_cookie()
tillåter nu användning avsamesite='None'
(sträng) för att uttryckligen ange att cookien skickas med alla förfrågningar på samma webbplats och mellan olika webbplatser.Den nya
HttpRequest.accepts()
-metoden returnerar om begäran accepterar den angivna MIME-typen enligt HTTP-headernAccept
.
Säkerhet¶
Inställningen
SECURE_REFERRER_POLICY
har nu standardvärdet'same-origin'
. Med detta konfigurerat ställerSecurityMiddleware
in :ref:referrer-policy``huvudet till ``samme-origin
på alla svar som inte redan har det. Detta förhindrar att rubrikenReferer
skickas till andra ursprung. Om du behöver det tidigare beteendet, sätt uttryckligenSECURE_REFERRER_POLICY
tillNone
.Standardalgoritmen för
django.core.signing.Signer
,django.core.signing.loads()
, ochdjango.core.signing.dumps()
ändras till SHA-256. Stöd för signaturer gjorda med den gamla SHA-1-algoritmen finns kvar fram till Django 4.0.Den nya parametern
algoritm
iSigner
gör det också möjligt att anpassa hashingalgoritmen.
Mallar¶
De omdöpta
translate
ochblocktranslate
malltaggarna introduceras för internationalisering i mallkoden. De äldre malltaggarnas aliastrans
ochblocktrans
fortsätter att fungera och kommer att behållas under överskådlig framtid.Malltaggen
include
accepterar nu iterabler av mallnamn.
Tester¶
SimpleTestCase
implementerar nu metodendebug()
som gör det möjligt att köra ett test utan att samla in resultatet och fånga upp undantag. Detta kan användas för att stödja körning av tester under en debugger.Den nya inställningen
MIGRATE
för testdatabaser gör det möjligt att inaktivera migreringar under skapandet av en testdatabas.DiscoverRunner
kan nu kassera utdata för godkända tester med hjälp avtest --buffer
.DiscoverRunner
hoppar nu över att köra systemkontrollerna på databaser som inte refereras av tester.TransactionTestCase
teardown är nu snabbare på MySQL på grund av förbättringar av kommandotflush
. Som en bieffekt återställer det senare inte automatiskt sekvenser vid nedmontering längre. AktiveraTransactionTestCase.reset_sequences
om dina tester kräver den här funktionen.
URL:er¶
:ref:
Path converters <registering-custom-path-converters>
kan nu skapaValueError
ito_url()
för att indikera att det inte finns någon matchning när URL:er vänds.
Verktyg¶
filepath_to_uri()
stöder nupathlib.Path
.parse_duration()
stöder nu kommaseparatorer för decimalfraktioner i ISO 8601-formatet.parse_datetime()
,parse_duration()
ochparse_time()
stöder nu kommaseparatorer för millisekunder.
Diverse¶
SQLite-backend har nu stöd för
pathlib.Path
för inställningenNAME
.settings.py
som genereras av kommandotstartproject
använder nupathlib.Path
istället föros.path
för att bygga filsystemssökvägar.Inställningen
TIME_ZONE
är nu tillåten för databaser som stöder tidszoner.
Bakåtkompatibla ändringar i 3.1¶
Databas backend API¶
I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.
DatabaseOperations.fetch_returned_insert_columns()
kräver nu ett ytterligarereturning_params
argument.egenskapen
connection.timezone
är nu'UTC'
som standard, ellerTIME_ZONE
närUSE_TZ
ärTrue
på databaser som stöder tidszoner. Tidigare var detNone
på databaser som stödjer tidszoner.egenskapen
connection._nodb_connection
ändras till metodenconnection._nodb_cursor()
och returnerar nu en kontexthanterare som ger en markör och automatiskt stänger markören och anslutningen närwith
-satsen avslutas.DatabaseClient.runshell()
kräver nu ett ytterligareparameters
argument som en lista med extra argument att skicka vidare till kommandoradsklienten.Det positionella argumentet
sequences
iDatabaseOperations.sql_flush()
ersätts av det booleska nyckelordsbara argumentetreset_sequences
. OmTrue
, kommer sekvenserna för de avkortade tabellerna att återställas.Argumentet
allow_cascade
iDatabaseOperations.sql_flush()
är nu ett argument som endast innehåller nyckelord.Det positionella argumentet
using
iDatabaseOperations.execute_sql_flush()
har tagits bort. Metoden använder nu databasen i den anropade instansen.Tredjeparts databasbackends måste implementera stöd för
JSONField
eller sättaDatabaseFeatures.supports_json_field
tillFalse
. Om lagring av primitiver inte stöds, sättDatabaseFeatures.supports_primitives_in_json_field
tillFalse
. Om det finns en sann datatyp för JSON, sättDatabaseFeatures.has_native_json_field
tillTrue
. Omjsonfield.contains
ochjsonfield.contained_by
inte stöds, sättDatabaseFeatures.supports_json_field_contains
tillFalse
.Tredjeparts databasbackends måste implementera introspektion för
JSONField
eller sättacan_introspect_json_field
tillFalse
.
Borttaget stöd för MariaDB 10.1¶
Uppströmsstöd för MariaDB 10.1 upphör i oktober 2020. Django 3.1 stöder MariaDB 10.2 och senare.
stöd för webbläsaren contrib.admin
¶
Administratören stöder inte längre den äldre webbläsaren Internet Explorer. Se :ref:``admin FAQ <admin-browser-support>` för information om webbläsare som stöds.
AbstractUser.first_name <django.contrib.auth.models.User.first_name>`
max_length
ökad till 150¶
En migrering för django.contrib.auth.models.User.first_name
ingår. Om du har en anpassad användarmodell som ärver från AbstractUser
måste du generera och tillämpa en databasmigrering för din användarmodell.
Om du vill behålla gränsen på 30 tecken för förnamn kan du använda ett anpassat formulär:
from django import forms
from django.contrib.auth.forms import UserChangeForm
class MyUserChangeForm(UserChangeForm):
first_name = forms.CharField(max_length=30, required=False)
Om du vill behålla denna begränsning i administratören när du redigerar användare, ställ in UserAdmin.form
för att använda detta formulär:
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
Diverse¶
Cache-nycklarna som används av
cache
och genereras avmake_template_fragment_key()
skiljer sig från de nycklar som genereras av äldre versioner av Django. Efter uppgradering till Django 3.1 kommer den första begäran till ett tidigare cachat mallfragment att vara en cachemiss.Logiken bakom beslutet att returnera ett omdirigeringsfallback eller ett 204 HTTP-svar från vyn
set_language()
baseras nu på HTTP-rubrikenAccept
istället för närvaron av HTTP-rubrikenX-Requested-With
.Kompatibilitetsimporten av
django.core.exceptions.EmptyResultSet
idjango.db.models.query
,django.db.models.sql
ochdjango.db.models.sql.datastructures
tas bort.Kompatibilitetsimporten av
django.core.exceptions.FieldDoesNotExist
idjango.db.models.fields
har tagits bort.Kompatibilitetsimporten av
django.forms.utils.pretty_name()
ochdjango.forms.boundfield.BoundField
idjango.forms.forms
tas bort.Kompatibilitetsimporten av
Context
,ContextPopException
ochRequestContext
idjango.template.base
tas bort.Kompatibilitetsimporten av
django.contrib.admin.helpers.ACTION_CHECKBOX_NAME
idjango.contrib.admin
har tagits bort.Inställningarna
STATIC_URL
ochMEDIA_URL
som är inställda på relativa sökvägar inleds nu med det servertillhandahållna värdet förSCRIPT_NAME
(eller/
om det inte är inställt). Denna ändring bör inte påverka inställningar som anges till giltiga webbadresser eller absoluta sökvägar.ConditionalGetMiddleware
lägger inte längre tillETag
-headern till svar med en tomcontent
.django.utils.decorators.classproperty()
dekoratorn görs publik och flyttas tilldjango.utils.functional.classproperty()
.floatformat
mallfilter ger nu ut (positiv)0
för negativa tal som avrundas till noll.Meta.ordering
ochMeta.unique_together
alternativ på modeller idjango.contrib
moduler som tidigare var tuples är nu listor.Admin-kalenderwidgeten hanterar nu tvåsiffriga årtal enligt Open Group Specification, dvs. värden mellan 69 och 99 mappas till föregående århundrade och värden mellan 0 och 68 mappas till innevarande århundrade.
Format som endast innehåller datum tas bort från standardlistan för
DATETIME_INPUT_FORMATS
.Widgeten
FileInput
renderar inte längre med HTML-attributetrequired
när initialdata finns.Den odokumenterade klassen
django.views.debug.ExceptionReporterFilter
har tagits bort. Enligt dokumentationen för Anpassade felrapporter måste klasser som ska användas medDEFAULT_EXCEPTION_REPORTER_FILTER
ärva fråndjango.views.debug.SafeExceptionReporterFilter
.Cache-timeouten som anges av
cache_page()
-dekoratorn har nu företräde framförmax-age
-direktivet frånCache-Control
-rubriken.Att tillhandahålla ett icke-lokalt fjärrfält i argumentet
ForeignKey.to_field
ger nu upphov tillFieldError
.SECURE_REFERRER_POLICY
har nu standardvärdet'same-origin'
. Se Vad är nytt Security-avsnittet ovan för mer information.ledningskommandot
check
kör nu systemkontrollernadatabas
endast för databasalias som anges med alternativetcheck --database
.migrate
kör nu kommandotdatabase
systemkontroller endast för en databas som ska migreras.Admin CSS-klasserna
row1
ochrow2
är borttagna till förmån för pseudoklasserna:nth-child(odd)
och:nth-child(even)
.Funktionen
make_password()
kräver nu att dess argument är en sträng eller bytes. Andra typer bör uttryckligen kastas till en av dessa.Den odokumenterade parametern
version
till funktionenAsKML
har tagits bort.JSON- och YAML-serialisatorer, som används av
dumpdata
, dumpar nu all data med Unicode som standard. Om du behöver det tidigare beteendet, skickaensure_ascii=True
till JSON-serialisatorn, ellerallow_unicode=False
till YAML-serialisatorn.Den automatiska omladdaren övervakar inte längre ändringar i inbyggda Django-översättningsfiler.
Den minsta versionen av
mysqlclient
som stöds har ökats från 1.3.13 till 1.4.0.De odokumenterade
django.contrib.postgres.forms.InvalidJSONInput
ochdjango.contrib.postgres.forms.JSONString
flyttas tilldjango.forms.fields
.Den odokumenterade klassen
django.contrib.postgres.fields.jsonb.JsonAdapter
tas bort.Taggen
{% localize off %}
och filtretunlocalize
respekterar inte längre inställningenDECIMAL_SEPARATOR
.Den lägsta versionen av
asgiref
som stöds har ökats från 3.2 till 3.2.10.Klassen Media återger nu
<script>
-taggar utan attributettype
för att följa `WHATWG:s rekommendationer <https://html.spec.whatwg.org/multipage/scripting.html#the-script-element>`_.ModelChoiceIterator
, som används avModelChoiceField
ochModelMultipleChoiceField
, ger nu 2-tupelval som innehållerModelChoiceIteratorValue
-instanser som det förstavalue
-elementet i varje val. I de flesta fall är detta en transparent proxy, men om du behöver självafield
-värdet använder du istället attributetModelChoiceIteratorValue.value
.
Funktioner som inte längre är aktuella i 3.1¶
PostgreSQL JSONField
¶
django.contrib.postgres.fields.JSONField
och django.contrib.postgres.forms.JSONField
är föråldrade till förmån för models.JSONField
och forms.JSONField
.
De odokumenterade django.contrib.postgres.fields.jsonb.KeyTransform
och django.contrib.postgres.fields.jsonb.KeyTextTransform
är också föråldrade till förmån för transformationerna i django.db.models.fields.json
.
De nya JSONField
, KeyTransform
och KeyTextTransform
kan användas på alla stödda databasbackends.
Diverse¶
inställningen
PASSWORD_RESET_TIMEOUT_DAYS
är utfasad till förmån förPASSWORD_RESET_TIMEOUT
.Den odokumenterade användningen av
isnull
lookup med icke-booleska värden som höger sida är avskriven, användTrue
ellerFalse
istället.Den knappt dokumenterade undantagsklassen
django.db.models.query_utils.InvalidQuery
är utfasad till förmån förFieldDoesNotExist
ochFieldError
.Ingångspunkten
django-admin.py
är föråldrad till förmån fördjango-admin
.Metoden
HttpRequest.is_ajax()
är utfasad eftersom den förlitade sig på ett jQuery-specifikt sätt att signalera AJAX-anrop, medan nuvarande användning tenderar att använda JavaScript Fetch API. Beroende på ditt användningsfall kan du antingen skriva din egen AJAX-detekteringsmetod eller använda den nyaHttpRequest.accepts()
-metoden om din kod är beroende av klientensAccept
HTTP-header.Om du skriver din egen AJAX-detekteringsmetod kan
request.is_ajax()
återges exakt somrequest.headers.get('x-requested-with') == 'XMLHttpRequest'
.Att skicka
None
som det första argumentet tilldjango.utils.deprecation.MiddlewareMixin.__init__()
är föråldrat.Kodningsformatet för cookie-värden som används av
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.0.Kodningsformatet för sessioner 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.0.
Det rent dokumentationsmässiga
providing_args
-argumentet förSignal
är föråldrat. Om du förlitar dig på detta argument som dokumentation kan du flytta texten till en kodkommentar eller docstring.Att anropa
django.utils.crypto.get_random_string()
utan ettlength
argument är föråldrat.Meddelandet
list
förModelMultipleChoiceField
är utfasat till förmån förinvalid_list
.Att skicka råa kolumnaliaser till
QuerySet.order_by()
är föråldrat. Samma resultat kan uppnås genom att skicka aliaser i enRawSQL
istället i förväg.Modellfältet
NullBooleanField
är föråldrat till förmån förBooleanField(null=True, blank=True)
.django.conf.urls.url()
alias avdjango.urls.re_path()
är föråldrat.Malltaggarna
{% ifequal %}
och{% ifnotequal %}
är avförda till förmån för{% if %}
.{% if %}
täcker alla användningsfall, men om du behöver fortsätta använda dessa taggar kan de extraheras från Django till en modul och inkluderas som en inbyggd tagg i'builtins'
alternativ iOPTIONS
.DEFAULT_HASHING_ALGORITHM
övergångsinställning är föråldrad.
Funktioner borttagna i 3.1¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 3.1.
Se Funktioner som inte längre är aktuella i 2.2 för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.
django.utils.timezone.FixedOffset
tas bort.django.core.paginator.QuerySetPaginator
tas bort.En modells
Meta.ordering
påverkar inteGROUP BY
-frågor.django.contrib.postgres.fields.FloatRangeField
ochdjango.contrib.postgres.forms.FloatRangeField
tas bort.Inställningen
FILE_CHARSET
tas bort.django.contrib.staticfiles.storage.CachedStaticFilesStorage
tas bort.Metoden
RemoteUserBackend.configure_user()
kräverrequest
som det första positionella argumentet.Stöd för
SimpleTestCase.allow_database_queries
ochTransactionTestCase.multi_db
har tagits bort.