Django 1.9 versionsinformation¶
1 december 2015
Välkommen till Django 1.9!
Dessa versionsinformation täcker de nya funktionerna, samt några bakåtkompatibla ändringar som du vill vara medveten om när du uppgraderar från Django 1.8 eller äldre versioner. Vi har ta bort några funktioner som har nått slutet av sin utfasningscykel, och vi har startat 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 1.9 kräver Python 2.7, 3.4 eller 3.5. Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.
Django 1.8-serien är den sista som stöder Python 3.2 och 3.3.
Vad är nytt i Django 1.9¶
Utföra åtgärder efter en transaktionspassning¶
Den nya on_commit()-hook gör det möjligt att utföra åtgärder efter att en databastransaktion har genomförts. Detta är användbart för uppgifter som att skicka e-postmeddelanden, skapa köade uppgifter eller inaktivera cacheminnen.
Denna funktionalitet från paketet django-transaction-hooks har integrerats i Django.
Validering av lösenord¶
Django erbjuder nu validering av lösenord för att förhindra att användare använder svaga lösenord. Valideringen är integrerad i de medföljande formulären för lösenordsändring och återställning och är enkel att integrera i annan kod. Valideringen utförs av en eller flera validerare, som konfigureras i den nya inställningen AUTH_PASSWORD_VALIDATORS.
Fyra validerare ingår i Django, som kan genomdriva en minimilängd, jämföra lösenordet med användarens attribut som namn, säkerställa att lösenord inte är helt numeriska eller kontrollera mot en medföljande lista över vanliga lösenord. Du kan kombinera flera validerare, och vissa validerare har anpassade konfigurationsalternativ. Du kan t.ex. välja att tillhandahålla en anpassad lista över vanliga lösenord. Varje validerare innehåller en hjälptext som förklarar dess krav för användaren.
Som standard utförs ingen validering och alla lösenord accepteras, så om du inte ställer in AUTH_PASSWORD_VALIDATORS kommer du inte att se någon förändring. I nya projekt som skapas med standardmallen startproject aktiveras en enkel uppsättning validerare. För att aktivera grundläggande validering i de auth-formulär som ingår i ditt projekt kan du till exempel ställa in:
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
Se Validering av lösenord för mer information.
Behörighetsmixins för klassbaserade vyer¶
Django levereras nu med mixinerna AccessMixin, LoginRequiredMixin, PermissionRequiredMixin, och UserPassesTestMixin för att tillhandahålla funktionaliteten i django.contrib.auth.decorators för klassbaserade vyer. Dessa mixins har hämtats från, eller är åtminstone inspirerade av, projektet django-braces.
Det finns dock några skillnader mellan Djangos och django-braces implementering:
Attributet
raise_exceptionkan endast varaTrueellerFalse. Egna undantag eller callables stöds inte.Metoden
handle_no_permission()tar inte ettrequestargument. Den aktuella begäran finns tillgänglig iself.request.Den anpassade
test_func()avUserPassesTestMixintar inte ettuserargument. Den aktuella användaren finns tillgänglig iself.request.user.Attributet
permission_requiredstöder en sträng (som definierar en behörighet) eller en lista/tupel av strängar (som definierar flera behörigheter) som måste uppfyllas för att ge åtkomst.Det nya attributet
permission_denied_messagegör det möjligt att skicka ett meddelande till undantagetPermissionDenied.
Ny styling för contrib.admin¶
Administratören har en modern, platt design med nya SVG-ikoner som ser perfekta ut på HiDPI-skärmar. Den ger fortfarande en fullt fungerande upplevelse till YUI:s A-grade webbläsare. Äldre webbläsare kan uppleva varierande nivåer av graciös nedbrytning.
Kör tester parallellt¶
Kommandot test stöder nu alternativet --parallel för att köra ett projekts tester i flera processer parallellt.
Varje process får sin egen databas. Du måste se till att olika testfall inte får tillgång till samma resurser. Exempelvis bör testfall som rör filsystemet skapa en tillfällig katalog för eget bruk.
Detta alternativ är aktiverat som standard för Djangos egen testsvit som tillhandahålls:
operativsystemet stöder det (alla utom Windows)
databasens backend stöder det (alla inbyggda backends utom Oracle)
Mindre funktioner¶
django.contrib.admin¶
Admin-vyer har nu attributen
model_adminelleradmin_site.URL:en för adminändringsvyn har ändrats (var
/admin/<app>/<model>/<pk>/som standard och är nu/admin/<app>/<model>/<pk>/change/). Detta bör inte påverka din applikation om du inte har hårdkodade administratörsadresser. I så fall ska du ersätta dessa länkar med reversing admin URLs istället. Observera att den gamla webbadressen fortfarande omdirigeras till den nya för bakåtkompatibilitet, men den kan tas bort i en framtida version.ModelAdmin.get_list_select_related()lades till för att tillåta ändring avselect_related()-värdena som används i admins changelist-fråga baserat på begäran.Kontextvariabeln
available_apps, som listar tillgängliga applikationer för den aktuella användaren, har lagts till i metodenAdminSite.each_context().AdminSite.empty_value_displayochModelAdmin.empty_value_displaylades till för att åsidosätta visningen av tomma värden i adminändringslistan. Du kan också anpassa värdet för varje fält.Lagt till jQuery-händelser när ett inline-formulär läggs till eller tas bort på sidan för ändringsformulär.
Tidsväljarwidgeten innehåller ett alternativ ”6 p.m.” för att konsekvent ha fördefinierade alternativ var 6:e timme.
JavaScript slug-generering stöder nu rumänska tecken.
django.contrib.admindocs¶
I modellavsnittet i
admindocsbeskrivs nu även metoder som tar argument, istället för att ignorera dem.
django.contrib.auth¶
Standardantalet iterationer för PBKDF2-lösenordshasher har ökats med 20%. Denna bakåtkompatibla ändring kommer inte att påverka användare som har underklassat
django.contrib.auth.hashers.PBKDF2PasswordHasherför att ändra standardvärdet.BCryptSHA256PasswordHasherkommer nu att uppdatera lösenord om dessroundsattribut ändras.AbstractBaseUserochBaseUserManagerflyttades till en nydjango.contrib.auth.base_user-modul så att de kan importeras utan att inkluderadjango.contrib.authiINSTALLED_APPS(att göra det gav upphov till en varning om föråldring i äldre versioner och stöds inte längre i Django 1.9).The permission argument of
permission_required()accepts all kinds of iterables, not only list and tuples.Den nya
PersistentRemoteUserMiddlewaregör det möjligt att användaREMOTE_USERför inställningar där rubriken endast fylls i på inloggningssidor istället för varje begäran i sessionen.Vyn
django.contrib.auth.views.password_reset()accepterar enextra_email_contextparameter.
django.contrib.contenttypes¶
Det är nu möjligt att använda
order_with_respect_tomed enGenericForeignKey.
django.contrib.gis¶
Alla
GeoQuerySet-metoder har utgått och ersatts av ekvivalenta databasfunktioner. Så snart de äldre metoderna har ersatts i din kod bör du till och med kunna ta bort den speciellaGeoManagerfrån dina GIS-aktiverade klasser.GDAL-gränssnittet stöder nu instansiering av filbaserade och minnesbaserade GDALRaster-objekt från rådata. Setters för rasteregenskaper som projektion eller pixelvärden har lagts till.
För PostGIS-användare tillåter den nya
RasterFieldlagring av GDALRaster-objekt. Den stöder automatisk skapande av rumsliga index och återprojektion när en modell sparas. Den stöder ännu inte rumsliga frågor.Den nya
GDALRaster.warp()-metoden gör det möjligt att warpa en raster genom att ange målrasteregenskaper som ursprung, bredd, höjd eller pixelstorlek (bland andra).Den nya
GDALRaster.transform()-metoden gör det möjligt att omvandla ett raster till ett annat rumsligt referenssystem genom att ange ett målsrid.Den nya
GeoIP2-klassen gör det möjligt att använda MaxMinds GeoLite2-databaser som inkluderar stöd för IPv6-adresser.Standardversionen av OpenLayers-biblioteket som ingår i widgetar har uppdaterats från 2.13 till 2.13.1.
django.contrib.postgres¶
Lagt till stöd för
rangefield.contained_bylookup för vissa inbyggda fält som motsvarar intervallfälten.Lade till
django.contrib.postgres.fields.JSONField.Lagt till PostgreSQL-specifika aggregeringsfunktioner.
Lagt till databasfunktionen
TransactionNow.
django.contrib.sessions¶
Sessionsmodellen och klasserna
SessionStoreför backendsdbochcached_dbhar omarbetats så att en anpassad databas-sessionsbackend kan bygga vidare på dem. Se Utökning av databasstödda sessionsmotorer för mer information.
django.contrib.sites¶
get_current_site()hanterar nu fallet därrequest.get_host()returnerardomän:port, t.ex.example.com:80. Om sökningen misslyckas på grund av att värden inte matchar en post i databasen och värden har en port, tas porten bort och sökningen görs om med endast domändelen.
Cache¶
django.core.cache.backends.base.BaseCachehar nu enget_or_set()metod.django.views.decorators.cache.never_cache()skickar nu mer övertygande rubriker (lagt tillno-cache, no-store, must-revalidatetillCache-Control) för att bättre förhindra cachelagring. Detta lades också till i Django 1.8.8.
CSRF¶
Namnet på begäranhuvudet som används för CSRF-autentisering kan anpassas med
CSRF_HEADER_NAME.CSRF-refererhuvudet valideras nu mot inställningen
CSRF_COOKIE_DOMAINom den är inställd. Se Hur det fungerar för detaljer.Den nya inställningen
CSRF_TRUSTED_ORIGINSger ett sätt att tillåta osäkra förfrågningar (t.ex.POST) över HTTPS.
Databas backends¶
PostgreSQL backend (
django.db.backends.postgresql_psycopg2) är också tillgänglig somdjango.db.backends.postgresql. Det gamla namnet kommer att fortsätta att vara tillgängligt för bakåtkompatibilitet.
Fil delning¶
Storage.get_valid_name()anropas nu närupload_toär en callable.Filehar nu metodenseekable()när Python 3 används.
Formulär¶
ModelFormaccepterar det nyaMeta-alternativetfield_classesför att anpassa typen av fält. Se Åsidosätta standardfälten för mer information.Du kan nu ange i vilken ordning formulärfälten ska återges med attributet
field_order, konstruktörsargumentetfield_ordereller metodenorder_fields().Ett formulärprefix kan anges i en formulärklass, inte bara när ett formulär instansieras. Se Prefix för former för mer information.
Du kan nu specificera nyckelordsargument som du vill skicka till konstruktören av formulär i en formuläruppsättning.
SlugFieldaccepterar nu ettallow_unicode-argument för att tillåta Unicode-tecken i slugs.CharFieldnow accepts astripargument to strip input data of leading and trailing whitespace. As this defaults toTruethis is different behavior from previous releases.Formulärfält har nu stöd för argumentet
disabled, vilket gör att fältwidgeten kan visas inaktiverad i webbläsare.It’s now possible to customize bound fields by overriding a field’s
get_bound_field()method.
Generiska åsikter¶
Klassbaserade vyer som genereras med
as_view()har nu attributenview_classochview_initkwargs.method_decorator()kan nu användas med en lista eller tupel av dekoratorer. Det kan också användas för att dekorera klasser istället för metoder.
Internationalisering¶
Vyn
django.views.i18n.set_language()omdirigerar nu korrekt till översatta webbadresser, när det finns tillgängligt.Vyn
django.views.i18n.javascript_catalog()fungerar nu korrekt om den används flera gånger med olika konfigurationer på samma sida.Funktionen
django.utils.timezone.make_aware()har fått ettis_dst-argument för att hjälpa till att lösa tvetydiga tider under DST-övergångar.Du kan nu använda lokalvarianter som stöds av gettext. Dessa används vanligtvis för språk som kan skrivas med olika skript, t.ex. latin och kyrilliska (t.ex.
be@latin).Lade till vyn
django.views.i18n.json_catalog()för att hjälpa till att bygga ett anpassat i18n-bibliotek på klientsidan på Django-översättningar. Den returnerar ett JSON-objekt som innehåller en översättningskatalog, formateringsinställningar och en pluralregel.Lade till attributet
name_translatedtill objektet som returneras avget_language_infomalltaggen. Lade också till ett motsvarande mallfilter:language_name_translated.Du kan nu köra
compilemessagesfrån rotkatalogen i ditt projekt och den kommer att hitta alla appmeddelandefiler som skapades avmakemessages.makemessagesanropar nuxgettexten gång per lokalkatalog istället för en gång per översättningsbar fil. Detta snabbar upp byggandet av lokaliseringar.blocktransstöder tilldelning av dess utdata till en variabel med hjälp avasvar.Två nya språk finns nu tillgängliga: Colombiansk spanska och skotsk gaeliska.
Kommandon för hantering¶
Med det nya kommandot
sendtestemailkan du skicka ett testmejl för att enkelt bekräfta att det fungerar att skicka e-post via Django.För att öka läsbarheten i SQL-koden som genereras av
sqlmigrate, föregås SQL-koden som genereras för varje migreringsoperation av en beskrivning av operationen.Utdata från kommandot
dumpdataär nu deterministiskt ordnad. När alternativet--outputanges visas dessutom en förloppsindikator i terminalen.Kommandot
createcachetablehar nu en--dry-runflagga för att skriva ut SQL istället för att köra den.Kommandot
startappskapar en fil med namnetapps.py. Eftersom det inte använderdefault_app_config(ett avrått API), måste du ange appkonfigurationens sökväg, t.ex.'polls.apps.PollsConfig', iINSTALLED_APPSför att den ska användas (istället för bara'polls').När du använder PostgreSQL-backend kan kommandot
dbshellansluta till databasen med lösenordet från din inställningsfil (istället för att kräva att det anges manuellt).Paketet
djangokan köras som ett skript, t.ex.python -m django, vilket kommer att bete sig på samma sätt somdjango-admin.Hanteringskommandon som har alternativet
--noinputtar nu också--no-inputsom ett alias för det alternativet.
Migreringar¶
Initiala migreringar markeras nu med ett klassattribut
initial = Truevilket gör attmigrate --fake-initiallättare kan upptäcka initiala migreringar.Lagt till stöd för serialisering av
functools.partialochLazyObjectinstanser.När man anger
Nonesom värde iMIGRATION_MODULES, kommer Django att betrakta appen som en app utan migreringar.Vid tillämpning av migreringar beräknar nu steget ”Rendering av modelltillstånd”, som visas när migrate körs med verbosity 2 eller högre, endast tillstånden för de migreringar som redan har tillämpats. Modelltillstånden för migreringar som tillämpas genereras på begäran, vilket drastiskt minskar mängden minne som krävs.
Denna förbättring är dock inte tillgänglig när migreringar inte tillämpas och kräver därför fortfarande förberäkning och lagring av de mellanliggande migreringstillstånden.
Denna förbättring kräver också att Django inte längre stöder blandade migreringsplaner. Blandade planer består av en lista med migreringar där vissa tillämpas och andra inte tillämpas. Detta stöddes aldrig officiellt och det fanns aldrig något offentligt API som stödde detta beteende.
Kommandot
squashmigrationshar nu stöd för att ange den startmigrering från vilken migreringar kommer att krossas.
Modeller¶
QuerySet.bulk_create()fungerar nu på proxymodeller.Databaskonfigurationen har fått ett alternativ
TIME_ZONEför interaktion med databaser som lagrar datatider i lokal tid och inte stöder tidszoner närUSE_TZärTrue.Lade till metoden
RelatedManager.set()till de relaterade hanterare som skapats avForeignKey,GenericForeignKeyochManyToManyField.Metoden
add()på en omvänd främmande nyckel har nu enbulk-parameter för att tillåta körning av en fråga oavsett antalet objekt som läggs till snarare än en fråga per objekt.Lade till parametern
keep_parentstillModel.delete()för att tillåta radering av endast ett barns data i en modell som använder arv med flera tabeller.Model.delete()ochQuerySet.delete()returnerar antalet objekt som raderats.Lagt till en systemkontroll för att förhindra att både
Meta.orderingochorder_with_respect_todefinieras på samma modell.Datum och tid-uppslag kan kedjas med andra uppslag (t.ex.exact,gt,ltetc.). Till exempel:Entry.objects.filter(pub_date__month__gt=6).Tidsuppslag (timme, minut, sekund) stöds nu av
TimeFieldför alla databasbackends. Stöd för andra backends än SQLite lades till men var odokumenterat i Django 1.7.Du kan ange parametern
output_fieldför aggregatetAvgför att aggregera över icke-numeriska kolumner, t.ex.DurationField.Lade till
datelookup tillDateTimeFieldför att göra det möjligt att fråga fältet med endast datumdelen.Lagt till databasfunktionen
Now, som returnerar aktuellt datum och tid.Transformär nu en underklass till Func() vilket gör attTransformkan användas på höger sida av ett uttryck, precis som vanligaFunc. Detta gör det möjligt att registrera vissa databasfunktioner somLength,LowerochUppersom transformationer.SlugFieldaccepterar nu ettallow_unicode-argument för att tillåta Unicode-tecken i slugs.Lagt till stöd för att referera till annoteringar i
QuerySet.distinct().connection.queriesvisar frågor med substituerade parametrar på SQLite.Query expressions kan nu användas när du skapar nya modellinstanser med
save(),create()ochbulk_create().
Förfrågningar och svar¶
Om inte
HttpResponse.reason_phraseuttryckligen anges, bestäms det nu av det aktuella värdet påHttpResponse.status_code. Om du ändrar värdet påstatus_codeutanför konstruktören ändras också värdet påreason_phrase.Felsökningsvyn visar nu detaljer om kedjade undantag i Python 3.
Standardvyerna för 40x-fel accepterar nu en andra positionell parameter, det undantag som utlöste vyn.
Felhanterare för vyer stöder nu
TemplateResponse, som ofta används med klassbaserade vyer.Undantag som uppstår i
render()-metoden skickas nu tillprocess_exception()-metoden i varje middleware.Middleware för begäran kan nu ställa in
HttpRequest.urlconftillNoneför att återställa alla ändringar som gjorts av tidigare middleware och återgå till att användaROOT_URLCONF.Kontrollen
DISALLOWED_USER_AGENTSiCommonMiddlewareger nu upphov till ettPermissionDeniedundantag i stället för att returnera ettHttpResponseForbiddenså atthandler403anropas.Added
HttpRequest.get_port()to fetch the originating port of the request.Lade till parametern
json_dumps_paramstillJsonResponseför att tillåta att nyckelordsargument skickas till anropetjson.dumps()som används för att generera svaret.Klassen:~django.middleware.common.BrokenLinkEmailsMiddleware ignorerar nu 404:or när referensen är lika med den begärda URL:en. För att kringgå kontrollen av tomma referenser som redan implementerats, sätter vissa webbrobotar referensen till den begärda URL:en.
Mallar¶
Malltaggar som skapats med hjälpen
simple_tag()kan nu lagra resultat i en mallvariabel genom att använda argumentetas.Lagt till en
Context.setdefault()metod.Loggern django.template har lagts till och innehåller följande meddelanden:
Ett meddelande på
DEBUG-nivå för saknade kontextvariabler.Ett meddelande på
WARNING-nivå för undantag som inte fångats upp och som uppstår under renderingen av en{% include %}när felsökningsläget är av (användbart eftersom{% include %}tystar undantaget och returnerar en tom sträng).
Malltaggen
firstofstöder lagring av utdata i en variabel med hjälp av ’as’.Context.update()kan nu användas som en kontexthanterare.Djangos mallladdare kan nu utöka mallar rekursivt.
Felsökningssidans mall postmortem innehåller nu utdata från varje motor som är installerad.
Debug page integration för anpassade mallmotorer har lagts till.
Backend
DjangoTemplateshar fått möjlighet att registrera bibliotek och builtins explicit genom mallensOPTIONS.Filtren
timesinceochtimeuntilförbättrades för att hantera skottår när de ges stora tidsspann.Taggen
includecachelagrar nu parsade mallobjekt under mallrendering, vilket påskyndar återanvändning på platser som for-loopar.
Tester¶
Lade till
json()-metoden för att testa klientsvar för att ge tillgång till svarskroppen som JSON.Added the
force_login()method to the test client. Use this method to simulate the effect of a user logging into the site while skipping the authentication and verification steps oflogin().
URL:er¶
Lookaround-assertions med reguljära uttryck tillåts nu i URL-mönster.
Applikationens namnrymd kan nu anges med hjälp av attributet
app_namepå den inkluderade modulen eller objektet. Det kan också ställas in genom att skicka en 2-tupel av (<list of patterns>, <application namespace>) som första argument tillinclude().Systemkontroller har lagts till för vanliga fel i URL-mönster.
Validerare¶
Lagt till
django.core.validators.int_list_validator()för att generera validerare av strängar som innehåller heltal separerade med ett anpassat tecken.EmailValidatorbegränsar nu längden på domännamnsetiketter till 63 tecken enligt RFC 1034.Lagt till
validate_unicode_slug()för att validera slugs som kan innehålla Unicode-tecken.
Bakåtkompatibla ändringar i 1.9¶
Varning
Utöver de ändringar som beskrivs i det här avsnittet bör du granska Funktioner borttagna i 1.9 för de funktioner som har nått slutet av sin föråldringscykel och därför har tagits bort. Om du inte har uppdaterat din kod inom utfasningscykeln för en viss funktion kan borttagningen av den framstå som en bakåtkompatibel ändring.
Databas backend API¶
Ett par nya tester förlitar sig på backendets förmåga att introspektera kolumnstandarder (returnerar resultatet som
Field.default). Du kan ställa in databasfunktionencan_introspect_defaulttillFalseom din backend inte implementerar detta. Du kanske vill granska implementeringen på de backends som Django inkluderar som referens (#24245).Det är inte lämpligt att registrera en global adapter eller konverterare på DB-API-modulens nivå för att hantera tidszonsinformation för
datetime-värden som skickas som frågeparametrar eller returneras som frågeresultat i databaser som inte stöder tidszoner. Det kan komma i konflikt med andra bibliotek.Det rekommenderade sättet att lägga till en tidszon i
datetime-värden som hämtas från databasen är att registrera en omvandlare förDateTimeFieldiDatabaseOperations.get_db_converters().Databasfunktionen
needs_datetime_string_casttogs bort. Databasbackends som ställer in den måste registrera en konverterare istället, enligt förklaringen ovan.Metoderna
DatabaseOperations.value_to_db_<type>()döptes om tilladapt_<type>field_value()för att spegla metodernaconvert_<type>field_value().För att använda den nya
date-uppslagningen kan tredjepartsdatabasbackends behöva implementera metodenDatabaseOperations.datetime_cast_date_sql().Metoden
DatabaseOperations.time_extract_sql()har lagts till. Den anropar den befintliga metodendate_extract_sql(). Denna metod åsidosätts av SQLite-backend för att lägga till tidsuppslagningar (timme, minut, sekund) tillTimeField, och kan behövas av tredjeparts databasbackend.Metoden
DatabaseOperations.datetime_cast_sql()(inte att förväxla medDatabaseOperations.datetime_cast_date_sql()som nämns ovan) har tagits bort. Denna metod användes för att formatera datum på Oracle långt före 1.0, men har inte åsidosatts av någon kärnbackend på flera år och har inte anropats någonstans i Djangos kod eller tester.För att stödja parallellisering av tester måste du implementera metoden
DatabaseCreation._clone_test_db()och ställa inDatabaseFeatures.can_clone_databases = True. Du kan behöva justeraDatabaseCreation.get_test_db_clone_settings().
Standardinställningar som var tupler är nu listor¶
Standardinställningarna i django.conf.global_settings var en kombination av listor och tupler. Alla inställningar som tidigare var tupler är nu listor.
attributet is_usable på mallladdare har tagits bort¶
Djangos mallladdare krävde tidigare att ett is_usable-attribut skulle definieras. Om en laddare konfigurerades i mallinställningarna och detta attribut var False, skulle laddaren ignoreras i tysthet. I praktiken användes detta endast av ägglastaren för att upptäcka om setuptools var installerat. Attributet is_usable är nu borttaget och ägglastaren misslyckas istället vid körning om setuptools inte är installerat.
Filsystembaserade mallladdare fångar upp mer specifika undantag¶
Vid användning av filesystem.Loader eller app_directories.Loader gav tidigare versioner av Django felmeddelandet TemplateDoesNotExist om en mallkälla fanns men var oläslig. Detta kunde hända under många omständigheter, till exempel om Django inte hade behörighet att öppna filen, eller om mallkällan var en katalog. Nu tystnar Django bara undantaget om mallkällan inte finns. Alla andra situationer resulterar i att det ursprungliga IOError tas upp.
HTTP-omdirigeringar tvingas inte längre till absoluta URI:er¶
Relativa omdirigeringar konverteras inte längre till absoluta URI:er. RFC 2616 krävde att rubriken Location i omdirigeringssvar skulle vara en absolut URI, men den har ersatts av RFC 7231 som tillåter relativa URI:er i Location, vilket är ett erkännande av den faktiska praxisen hos användaragenter, som nästan alla stöder dem.
Följaktligen bör de förväntade webbadresserna som skickas till assertRedirects i allmänhet inte längre innehålla schema- och domändelen av webbadresserna. Till exempel bör self.assertRedirects(response, 'http://testserver/some-url/') ersättas med self.assertRedirects(response, '/some-url/') (såvida inte omdirigeringen specifikt innehöll en absolut URL).
I det sällsynta fallet att du behöver det gamla beteendet (upptäckt med en gammal version av Apache med mod_scgi som tolkar en relativ omdirigering som en ”intern omdirigering”) kan du återställa det genom att skriva en anpassad middleware:
class LocationHeaderFix(object):
def process_response(self, request, response):
if "Location" in response:
response["Location"] = request.build_absolute_uri(response["Location"])
return response
Slopat stöd för PostgreSQL 9.0¶
Uppströmsstöd för PostgreSQL 9.0 slutade i september 2015. Som en följd av detta ställer Django 1.9 9.1 som den minsta PostgreSQL-versionen som den officiellt stöder.
Upphört stöd för Oracle 11.1¶
Uppströmsstödet för Oracle 11.1 upphörde i augusti 2015. Som en följd av detta anger Django 1.9 11.2 som den lägsta Oracle-versionen som den officiellt stöder.
Mallarna LoaderOrigin och StringOrigin har tagits bort¶
I tidigare versioner av Django, när en mallmotor initialiserades med debug som True, ställdes en instans av django.template.loader.LoaderOrigin eller django.template.base.StringOrigin in som ursprungsattribut på mallobjektet. Dessa klasser har kombinerats till Origin och är nu alltid inställda oavsett inställningen för felsökning av motorn. För en minimal nivå av bakåtkompatibilitet kommer de gamla klassnamnen att behållas som alias till den nya klassen Origin fram till Django 2.0.
Ändringar av standardkonfigurationen för loggning¶
För att göra det enklare att skriva anpassade loggningskonfigurationer definierar Djangos standardloggningskonfiguration inte längre django.request och django.security loggers. Istället definieras en enda django-logger, filtrerad på INFO-nivå, med två hanterare:
console: filtreras påINFO-nivå och är endast aktiv omDEBUG=True.mail_admins: filtreras påERROR-nivå och är endast aktiv omDEBUG=False.
Om du inte åsidosätter Djangos standardloggning bör du se minimala förändringar i beteendet, men du kanske ser en del ny loggning till konsolen runserver, till exempel.
Om du åsidosätter Djangos standardloggning bör du kontrollera hur din konfiguration smälter samman med de nya standardinställningarna.
HttpRequest detaljer i felrapportering¶
Det var överflödigt att visa alla detaljer om HttpRequest varje gång den dök upp som en stack frame-variabel i HTML-versionen av felsökningssidan och felmeddelandet. Således kommer HTTP-begäran nu att visa samma standardrepresentation som andra variabler (repr(request)). Som ett resultat av detta togs metoden ExceptionReporterFilter.get_request_repr() och den odokumenterade funktionen django.http.build_request_repr() bort.
Innehållet i textversionen av e-postmeddelandet ändrades för att ge en spårning med samma struktur som vid AJAX-förfrågningar. Spårningsinformationen återges med metoden ExceptionReporter.get_traceback_text().
Borttagning av tidszonmedvetna globala adaptrar och omvandlare för datatider¶
Django registrerar inte längre globala adaptrar och omvandlare för att hantera tidszonsinformation på datetime-värden som skickas till databasen som frågeparametrar eller läses från databasen i frågeresultat. Denna ändring påverkar projekt som uppfyller alla följande villkor:
Inställningen
USE_TZärTrue.Databasen är SQLite, MySQL, Oracle eller en tredjepartsdatabas som inte stöder tidszoner. Om du är osäker kan du kontrollera värdet på
connection.features.supports_timezones.Koden ställer frågor till databasen utanför ORM, vanligtvis med
cursor.execute(sql, params).
Om du skickar medvetna datetime-parametrar till sådana frågor bör du omvandla dem till naiva datatider i UTC:
from django.utils import timezone
param = timezone.make_naive(param, timezone.utc)
Om du inte gör det kommer konverteringen att utföras som i tidigare versioner (med en deprecation-varning) fram till och med Django 1.11. Django 2.0 kommer inte att utföra någon konvertering, vilket kan leda till datakorruption.
Om du läser datetime-värden från resultaten kommer de att vara naiva i stället för medvetna. Du kan kompensera på följande sätt:
from django.utils import timezone
value = timezone.make_aware(value, timezone.utc)
Du behöver inte något av detta om du frågar databasen via ORM, även om du använder raw() frågor. ORM tar hand om hanteringen av tidszoninformation.
Moduler för malltaggar importeras när mallar konfigureras¶
Backend DjangoTemplates utför nu upptäckt på installerade malltaggmoduler när den instansieras. Denna uppdatering gör det möjligt att tillhandahålla bibliotek uttryckligen via nyckeln 'libraries' i OPTIONS när man definierar en DjangoTemplates-backend. Import- eller syntaxfel i malltaggmoduler misslyckas nu tidigt vid instantiering snarare än när en mall med en {% load %}-tagg först kompileras.
django.template.base.add_to_builtins() tas bort¶
Även om det var ett privat API, använde projekt ofta add_to_builtins() för att göra malltaggar och filter tillgängliga utan att använda {% load %}-taggen. Detta API har formaliserats. Projekt bör nu definiera inbyggda bibliotek via nyckeln 'builtins' i OPTIONS när de definierar en DjangoTemplates-backend.
simple_tag omsluter nu taggutdata i conditional_escape¶
I allmänhet autoescaper inte malltaggar sitt innehåll, och detta beteende är dokumenterat. För taggar som inclusion_tag är detta inte ett problem eftersom den inkluderade mallen kommer att utföra autoescaping. För assignment_tag() kommer utdata att escapas när den används som en variabel i mallen.
För de avsedda användningsfallen för simple_tag är det dock mycket lätt att få felaktig HTML och eventuellt en XSS-exploatering. Till exempel:
@register.simple_tag(takes_context=True)
def greeting(context):
return "Hello {0}!".format(context["request"].user.first_name)
I äldre versioner av Django kommer detta att vara ett XSS-problem eftersom user.first_name inte är escaped.
I Django 1.9 är detta åtgärdat: om mallkontexten har autoescape=True inställt (standard), kommer simple_tag att omsluta utdata från taggfunktionen med conditional_escape().
För att åtgärda dina simple_tag är det bäst att tillämpa följande metoder:
All kod som genererar HTML bör använda antingen mallsystemet eller
format_html().Om utdata från en
simple_tagbehöver escapas, användescape()ellerconditional_escape().Om du är helt säker på att du matar ut HTML från en betrodd källa (t.ex. ett CMS-fält som lagrar HTML som matats in av administratörer) kan du markera det som sådant med
mark_safe().
Taggar som följer dessa regler kommer att vara korrekta och säkra oavsett om de körs på Django 1.9+ eller tidigare.
Paginator.page_range¶
Paginator.page_range är nu en iterator istället för en lista.
I versioner av Django tidigare än 1.8 returnerade Paginator.page_range en list i Python 2 och en range i Python 3. Django 1.8 returnerade konsekvent en lista, men en iterator är mer effektiv.
Befintlig kod som är beroende av list-specifika funktioner, t.ex. indexering, kan överföras genom att omvandla iteratorn till en list med hjälp av list().
Implicit QuerySet __in lookup borttagen¶
I tidigare versioner kunde frågor som:
Model.objects.filter(related_id=RelatedModel.objects.all())
skulle implicit konverteras till:
Model.objects.filter(related_id__in=RelatedModel.objects.all())
vilket resulterar i SQL som "related_id IN (SELECT id FROM ...)".
Denna implicita __in sker inte längre så ”IN” SQL är nu ”=”, och om underfrågan returnerar flera resultat kommer åtminstone vissa databaser att ge ett felmeddelande.
stöd för webbläsaren contrib.admin¶
Administratören stöder inte längre Internet Explorer 8 och lägre, eftersom dessa webbläsare har nått slutet av livscykeln.
CSS och bilder för att stödja Internet Explorer 6 och 7 har tagits bort. PNG- och GIF-ikoner har ersatts med SVG-ikoner, som inte stöds av Internet Explorer 8 och tidigare.
Biblioteket jQuery som är inbäddat i admin har uppgraderats från version 1.11.2 till 2.1.4. jQuery 2.x har samma API som jQuery 1.x, men stöder inte Internet Explorer 6, 7 eller 8, vilket ger bättre prestanda och mindre filstorlek. Om du behöver stöd för IE8 och även måste använda den senaste versionen av Django kan du åsidosätta administratörens kopia av jQuery med din egen genom att skapa en Django-applikation med den här strukturen:
app/static/admin/js/vendor/
jquery.js
jquery.min.js
SyntaxError vid installation av Django setuptools 5.5.x¶
När du installerar Django 1.9 eller 1.9.1 med setuptools 5.5.x, kommer du att se:
Compiling django/conf/app_template/apps.py ...
File "django/conf/app_template/apps.py", line 4
class {{ camel_case_app_name }}Config(AppConfig):
^
SyntaxError: invalid syntax
Compiling django/conf/app_template/models.py ...
File "django/conf/app_template/models.py", line 1
{{ unicode_literals }}from django.db import models
^
SyntaxError: invalid syntax
Det är säkert att ignorera dessa fel (Django kommer fortfarande att installeras bra), men du kan undvika dem genom att uppgradera setuptools till en nyare version. Om du använder pip kan du uppgradera pip med python -m pip install -U pip vilket också kommer att uppgradera setuptools. Detta är löst i senare versioner av Django enligt beskrivningen i Django 1.9.2 versionsinformation.
Diverse¶
De statiska jQuery-filerna i
contrib.adminhar flyttats till envendor/jquery-underkatalog.Den text som visas för null-kolumner i cellerna i admin-ändringslistan
list_displayhar ändrats från(None)(eller dess översatta motsvarighet) till-(ett streck).django.http.responses.REASON_PHRASESochdjango.core.handlers.wsgi.STATUS_CODE_TEXThar tagits bort. Använd Pythons standardbibliotek i stället:http.client.responsesför Python 3 och httplib.responses för Python 2.ValuesQuerySetochValuesListQuerySethar tagits bort.Mallen
admin/base.htmlställer inte längre inwindow.__admin_media_prefix__ellerwindow.__admin_utc_offset__. Bildreferenser i JavaScript som använde det värdet för att konstruera absoluta webbadresser har flyttats till CSS för enklare anpassning. UTC-offset lagras i ett dataattribut i taggen<body>.valideringen av
CommaSeparatedIntegerFieldhar förfinats för att förbjuda värden som',',',1'och'1,,2'.Formulärinitialisering flyttades från metoden
ProcessFormView.get()till den nya metodenFormMixin.get_context_data(). Detta kan vara inkompatibelt bakåt om du har åsidosatt metodenget_context_data()utan att anropasuper().Stöd för PostGIS 1.5 har tagits bort.
Fältet
django.contrib.sites.models.Site.domainändrades till att varaunique.För att genomdriva testisolering tillåts inte databasfrågor som standard i
SimpleTestCase-tester längre. Du kan inaktivera detta beteende genom att ställa in klassattributetallow_database_queriestillTruepå din testklass.ResolverMatch.app_namehar ändrats så att den innehåller hela sökvägen till namnrymden om det finns nästlade namnrymder. För konsekvens medResolverMatch.namespaceär det tomma värdet nu en tom sträng istället förNone.Av säkerhetsskäl måste sessionsnycklar bestå av minst 8 tecken.
Den privata funktionen
django.utils.functional.total_ordering()har tagits bort. Den innehöll en lösning för ett fel ifunctools.total_ordering()i Python-versioner äldre än 2.7.3.XML-serialisering (antingen via
dumpdataeller syndikeringsramverket) brukade mata ut alla tecken som den mottog. Om innehållet som skall serialiseras innehåller kontrolltecken som inte är tillåtna i XML 1.0-standarden, kommer serialiseringen att misslyckas med ettValueError.CharFieldtar nu bort inledande och avslutande blanksteg som standard. Detta kan inaktiveras genom att ställa in det nyastrip-argumentet tillFalse.Malltext som översätts och använder två eller flera procenttecken i följd, t.ex.
"%%", kan få ett nyttmsgidefter attmakemessageskörts (troligen kommer översättningen att markeras som luddig). Det nyamsgidkommer att markeras med"#, python-format".Om varken
request.current_appellerContext.current_appär inställda, kommer malltaggenurlnu att använda namnrymden för den aktuella begäran. Ställ inrequest.current_apptillNoneom du inte vill använda en namnrymdshint.Inställningen
SILENCED_SYSTEM_CHECKStystar nu meddelanden på alla nivåer. Tidigare skrevs meddelanden påERROR-nivå eller högre ut till konsolen.Fältet
FlatPage.enable_commentsär borttaget frånFlatPageAdmineftersom det inte används av applikationen. Om ditt projekt eller en tredjepartsapplikation använder det, skapa en anpassad ModelAdmin för att lägga till det igen.Returvärdet för
setup_databases()och det första argumentet förteardown_databases()ändrades. De brukade vara(old_names, mirrors)-tupler. Nu är de bara det första objektet,old_names.Som standard försöker
LiveServerTestCaseatt hitta en tillgänglig port i intervallet 8081-8179 istället för att bara försöka med port 8081.Systemkontrollerna för
ModelAdminkontrollerar nu instanser istället för klasser.Det privata API:et för att tillämpa blandade migreringsplaner har tagits bort av prestandaskäl. Blandade planer består av en lista med migreringar där vissa tillämpas och andra inte tillämpas.
Deskriptorklasserna för relaterade modellobjekt i
django.db.models.fields.related(privat API) flyttas från modulenrelatedtillrelated_descriptorsoch byter namn enligt följande:ReverseSingleRelatedObjectDescriptorärForwardManyToOneDescriptorSingleRelatedObjectDescriptorärReverseOneToOneDescriptorForeignRelatedObjectsDescriptorärReverseManyToOneDescriptorMångaRelateradeObjektDeskriptorärMångaTillMångaDeskriptor
Om du implementerar en anpassad
handler404-vy måste den returnera ett svar med en HTTP 404-statuskod. AnvändHttpResponseNotFoundeller skickastatus=404tillHttpResponse. Annars kommerAPPEND_SLASHinte att fungera korrekt medDEBUG=False.
Funktioner som inte längre är aktuella i 1.9¶
tilldelning_tag()¶
Django 1.4 lade till hjälpen assignment_tag för att underlätta skapandet av malltaggar som lagrar resultat i en mallvariabel. Hjälpen simple_tag() har fått samma förmåga, vilket gör assignment_tag föråldrad. Taggar som använder assignment_tag bör uppdateras till att använda simple_tag.
{% cycle %} syntax med kommaseparerade argument¶
Taggen cycle har stöd för en gammal syntax från tidigare Django-versioner:
{% cycle row1,row2,row3 %}
Dess parsning orsakade buggar med den nuvarande syntaxen, så stöd för den gamla syntaxen kommer att tas bort i Django 1.10 efter en påskyndad avskrivning.
ForeignKey och OneToOneField on_delete argument¶
För att öka medvetenheten om cascading model deletion kommer argumentet on_delete för ForeignKey och OneToOneField att krävas i Django 2.0.
Uppdatera modeller och befintliga migreringar så att argumentet anges explicit. Eftersom standard är models.CASCADE, lägg till on_delete=models.CASCADE till alla ForeignKey och OneToOneField som inte använder ett annat alternativ. Du kan också skicka det som det andra positionella argumentet om du inte bryr dig om kompatibilitet med äldre versioner av Django.
Field.rel ändringar¶
Field.rel och dess metoder och attribut har ändrats för att matcha API:et för relaterade fält. Attributet Field.rel har bytt namn till remote_field och många av dess metoder och attribut har antingen ändrats eller bytt namn.
Syftet med dessa ändringar är att tillhandahålla ett dokumenterat API för relationsfält.
anpassade metoder för GeoManager och GeoQuerySet¶
Alla anpassade GeoQuerySet-metoder (area(), distance(), gml(), …) har ersatts av motsvarande geografiska uttryck i annoteringar (se under nya funktioner). Därför är behovet av att ställa in en anpassad GeoManager till GIS-aktiverade modeller nu föråldrat. Så snart din kod inte anropar någon av de föråldrade metoderna kan du helt enkelt ta bort raderna objects = GeoManager() från dina modeller.
API:erna för mallladdare har ändrats¶
Djangos mallladdare har uppdaterats för att tillåta rekursiv förlängning av mallar. Denna förändring krävde ett nytt API för mallladdare. De gamla metoderna load_template() och load_template_sources() är nu föråldrade. Detaljer om det nya API:et finns i dokumentationen för mallladdaren.
Överlämnar en 3-tupel eller ett app_name till include()¶
Instansnamnrymdsdelen av att skicka en tupel som ett argument till include() har ersatts med att skicka argumentet namespace till include(). Till exempel:
polls_patterns = [
url(...),
]
urlpatterns = [
url(r"^polls/", include((polls_patterns, "polls", "author-polls"))),
]
blir:
polls_patterns = (
[
url(...),
],
"polls",
) # 'polls' is the app_name
urlpatterns = [
url(r"^polls/", include(polls_patterns, namespace="author-polls")),
]
Argumentet app_name till include() har ersatts med att skicka en 2-tupel (som ovan), eller att skicka ett objekt eller en modul med ett app_name-attribut (som nedan). Om app_name anges på det här nya sättet behövs inte längre argumentet namespace. Det kommer som standard att motsvara värdet för app_name. Till exempel ändras URL-mönstren i handledningen från:
mysite/urls.py¶urlpatterns = [url(r"^polls/", include("polls.urls", namespace="polls")), ...]
till:
mysite/urls.py¶urlpatterns = [
url(r"^polls/", include("polls.urls")), # 'namespace="polls"' removed
...,
]
polls/urls.py¶app_name = "polls" # added
urlpatterns = [...]
Denna ändring innebär också att det gamla sättet att inkludera en AdminSite-instans är föråldrat. Skicka istället admin.site.urls direkt till django.conf.urls.url():
urls.py¶from django.conf.urls import url
from django.contrib import admin
urlpatterns = [
url(r"^admin/", admin.site.urls),
]
URL-applikationens namnrymd krävs om man anger en instansnamnrymd¶
Tidigare kunde en instansnamnrymd utan en applikationsnamnrymd tjäna samma syfte som applikationsnamnrymden, men det var omöjligt att vända på mönstret om det fanns en applikationsnamnrymd med samma namn. Inkluderingar som anger ett instansnamnområde kräver att den inkluderade URLconf anger ett applikationsnamnområde.
parameter för aktuell_app till contrib.auth-vyer¶
Alla vyer i django.contrib.auth.views har följande struktur:
def view(request, ..., current_app=None, ...):
...
if current_app is not None:
request.current_app = current_app
return TemplateResponse(request, template_name, context)
Från och med Django 1.8 ställs current_app in på request-objektet. För konsekvensens skull kommer dessa vyer att kräva att den som anropar ställer in current_app på request istället för att skicka det i ett separat argument.
django.contrib.gis.geoip¶
Modulen django.contrib.gis.geoip2 ersätter django.contrib.gis.geoip. Den nya modulen tillhandahåller ett liknande API förutom att den inte tillhandahåller de äldre GeoIP-Python API-kompatibilitetsmetoderna.
Diverse¶
Argumentet
weaktilldjango.dispatch.signals.Signal.disconnect()har utgått eftersom det inte har någon effekt.Metoden
check_aggregate_support()idjango.db.backends.base.BaseDatabaseOperationshar blivit föråldrad och kommer att tas bort i Django 2.0. Den mer allmännacheck_expression_support()bör användas istället.django.forms.extrasär föråldrad. Du kan hittaSelectDateWidgetidjango.forms.widgets(eller helt enkeltdjango.forms) istället.Privat API
django.db.models.fields.add_lazy_relation()är föråldrat.Dekoratorn
django.contrib.auth.tests.utils.skipIfCustomUser()är föråldrad. Med testupptäcktsändringarna i Django 1.6 körs inte längre testerna fördjango.contrib-appar som en del av användarens projekt. Därför behövs inte längre dekoratorn@skipIfCustomUserför att dekorera tester idjango.contrib.auth.Om du har anpassat några felshanterare, är vynsignaturerna med endast en requestparameter föråldrade. Vyerna bör nu också acceptera en andra
exceptionpositionell parameter.Attributen
django.utils.feedgenerator.Atom1Feed.mime_typeochdjango.utils.feedgenerator.RssFeed.mime_typeär föråldrade till förmån förcontent_type.Signerger nu en varning om en ogiltig separator används. Detta kommer att bli ett undantag i Django 1.10.django.db.models.Field._get_val_from_obj()är föråldrad till förmån förField.value_from_object().django.template.loaders.eggs.Loaderär föråldrad eftersom det inte rekommenderas att distribuera applikationer som ägg.Nyckelordsargumentet
callable_objtillSimpleTestCase.assertRaisesMessage()är föråldrat. Skicka istället den anropsbara som ett positionellt argument.Attributet
allow_tagspå metoder förModelAdminhar utgått. Användformat_html(),format_html_join(), ellermark_safe()när du konstruerar metodens returvärde istället.Nyckelordsargumentet
enclosuretillSyndicationFeed.add_item()är föråldrat. Använd det nyaenclosuresargumentet som accepterar en lista medEnclosureobjekt istället för ett enda.Aliasen
django.template.loader.LoaderOriginochdjango.template.base.StringOriginfördjango.template.base.Originär föråldrade.
Funktioner borttagna i 1.9¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 1.9. Se Funktioner som inte längre är aktuella i 1.7 för detaljer, inklusive hur man tar bort användningen av dessa funktioner.
django.utils.dictconfighar tagits bort.django.utils.importlibär borttagen.django.utils.tzinfohar tagits bort.django.utils.unittesthar tagits bort.Kommandot
syncdbhar tagits bort.django.db.models.signals.pre_syncdbochdjango.db.models.signals.post_syncdbtas bort.Stöd för
allow_syncdbpå databasroutrar har tagits bort.Automatisk synkronisering av appar utan migreringar har tagits bort. Migreringar är obligatoriska för alla appar om du inte anger alternativet
migrate --run-syncdb.SQL-hanteringskommandona för appar utan migreringar,
sql,sqlall,sqlclear,sqldropindexesochsqlindexes, har tagits bort.Stöd för automatisk laddning av
initial_data-fixturer och inledande SQL-data har tagits bort.Alla modeller måste definieras i en installerad applikation eller deklarera en explicit
app_label. Dessutom är det inte möjligt att importera dem innan deras applikation har laddats. I synnerhet är det inte möjligt att importera modeller inuti rotpaketet för en applikation.Modellen och formuläret
IPAddressFieldtas bort. Ett stub-fält finns kvar för kompatibilitet med historiska migreringar.AppCommand.handle_app()stöds inte längre.RequestSiteochget_current_site()är inte längre importerbara fråndjango.contrib.sites.models.FastCGI-stöd via hanteringskommandot
runfcgihar tagits bort.django.utils.datastructures.SortedDicttas bort.ModelAdmin.declared_fieldsetshar tagits bort.Modulerna
utilsom gav bakåtkompatibilitet har tagits bort:django.contrib.admin.utildjango.contrib.gis.db.backends.utildjango.db.backends.utildjango.forms.util
ModelAdmin.get_formsetshar tagits bort.De bakåtkompatibla shims som infördes för att byta namn på metoden
BaseMemcachedCache._get_memcache_timeout()tillget_backend_timeout()har tagits bort.Alternativen
--naturaloch-nfördumpdatahar tagits bort.Argumentet
use_natural_keysförserializers.serialize()har tagits bort.Det privata API:et
django.forms.forms.get_declared_fields()har tagits bort.Möjligheten att använda en
SplitDateTimeWidgetmedDateTimeFieldhar tagits bort.Egenskapen
WSGIRequest.REQUESTtas bort.Klassen
django.utils.datastructures.MergeDictär borttagen.Språkkoderna
zh-cnochzh-twhar tagits bort.Den interna
django.utils.functional.memoize()tas bort.django.core.cache.get_cacheär borttagen.django.db.models.loadingär borttagen.Det är inte längre möjligt att skicka anropsbara argument till querysets.
BaseCommand.requires_model_validationtas bort till förmån förrequires_system_checks. Admin-validatorer ersätts av admin-kontroller.Attributen
ModelAdmin.validator_classochdefault_validator_classtas bort.ModelAdmin.validate()har tagits bort.django.db.backends.DatabaseValidation.validate_fieldtas bort till förmån för metodencheck_field.Ledningskommandot
validatehar tagits bort.django.utils.module_loading.import_by_pathtas bort till förmån fördjango.utils.module_loading.import_string.ssiochurlmalltaggar är borttagna frånfuturemalltaggsbiblioteket.django.utils.text.javascript_quote()har tagits bort.Databasens testinställningar som självständiga poster i databasinställningarna, med prefixet
TEST_, stöds inte längre.Alternativet
cache_choicestillModelChoiceFieldochModelMultipleChoiceFieldhar tagits bort.Standardvärdet för attributet
RedirectView.permanenthar ändrats frånTruetillFalse.django.contrib.sitemaps.FlatPageSitemaptas bort till förmån fördjango.contrib.flatpages.sitemaps.FlatPageSitemap.Privat API
django.test.utils.TestTemplateLoadertas bort.Modulen
django.contrib.contenttypes.generichar tagits bort.