Django 1.11 release notes¶
4 april 2017
Välkommen till Django 1.11!
Dessa release notes täcker nya funktioner, samt några bakåtkompatibla ändringar som du bör vara medveten om när du uppgraderar från Django 1.10 eller äldre versioner. Vi har börjat utfasningsprocessen för vissa funktioner.
Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.
Django 1.11 betecknas som en long-term support release. Den kommer att få säkerhetsuppdateringar i minst tre år efter att den släppts. Stöd för den tidigare LTS, Django 1.8, kommer att upphöra i april 2018.
Kompatibilitet med Python¶
Django 1.11 kräver Python 2.7, 3.4, 3.5, 3.6 eller 3.7 (från och med 1.11.17). Vi rekommenderar starkt och stöder endast officiellt den senaste utgåvan av varje serie.
Django 1.11.x-serien är den sista som stöder Python 2. Nästa stora version, Django 2.0, kommer endast att stödja Python 3.4+.
Föråldrade varningar är inte längre högljudda som standard¶
Till skillnad från äldre versioner av Django visas inte längre Djangos egna deprecation-varningar som standard. Detta överensstämmer med Pythons standardbeteende.
Denna ändring gör det möjligt för tredjepartsappar att stödja både Django 1.11 LTS och Django 1.8 LTS utan att behöva lägga till kod för att undvika varningar om utfasning.
Efter lanseringen av Django 2.0 föreslår vi att tredjepartsappförfattare släpper stödet för alla versioner av Django före 1.11. Vid den tiden 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 för utfasning bör din app vara kompatibel med Django 2.0.
Vad är nytt i Django 1.11¶
Klassbaserade modellindex¶
Den nya modulen django.db.models.indexes
innehåller klasser som underlättar skapandet av databasindex. Index läggs till i modeller med hjälp av alternativet Meta.indexes
.
Klassen Index
skapar ett b-tree index, som om du använt db_index
på modellfältet eller index_together
på modellens Meta
klass. Den kan underklassificeras för att stödja olika indextyper, till exempel GinIndex
. Det gör det också möjligt att definiera ordningen (ASC/DESC) för kolumnerna i indexet.
Template-baserad widget-rendering¶
För att underlätta anpassningen av widgetar görs renderingen av formulärwidgetar nu med hjälp av mallsystemet i stället för i Python. Se API för rendering av formulär.
Du kan behöva justera eventuella anpassade widgetar som du har skrivit för några bakåtkompatibla ändringar.
uttryck för Subquery
¶
De nya databasuttrycken Subquery
och Exists
gör det möjligt att skapa explicita underfrågor. Underfrågor kan hänvisa till fält från den yttre frågeuppsättningen med hjälp av klassen OuterRef
.
Mindre funktioner¶
django.contrib.admin
¶
ModelAdmin.date_hierarchy
kan nu referera till fält över relationer.Den nya
ModelAdmin.get_exclude()
-kroken gör det möjligt att ange de uteslutna fälten baserat på begäran eller modellinstansen.Mallen
popup_response.html
kan nu åsidosättas per app, per modell eller genom att ställa in attributetModelAdmin.popup_response_template
.
django.contrib.auth
¶
Standardantalet iterationer för PBKDF2-lösenordshasher ökas med 20%.
De klassbaserade vyerna
LoginView
ochLogoutView
ersätter de föråldrade funktionsbaserade vyernalogin()
ochlogout()
.Klasserna
PasswordChangeView
,PasswordChangeDoneView
,PasswordResetView
,PasswordResetDoneView
,PasswordResetConfirmView
ochPasswordResetCompleteView
klassbaserade vyer ersätter de föråldrade funktionsbaserade vyernapassword_change()
,password_change_done()
,password_reset()
,password_reset_done()
,password_reset_confirm()
ochpassword_reset_complete()
.Det nya attributet
post_reset_login
förPasswordResetConfirmView
gör det möjligt att automatiskt logga in en användare efter en lyckad lösenordsåterställning. Om du har konfigurerat fleraAUTHENTICATION_BACKENDS
, använd attributetpost_reset_login_backend
för att välja vilken som ska användas.För att undvika möjligheten att läcka en token för återställning av lösenord via HTTP Referer-headern (till exempel om återställningssidan innehåller en referens till CSS eller JavaScript som finns på en annan domän), lagrar
PasswordResetConfirmView
(men inte den föråldradepassword_reset_confirm()
funktionsbaserade vyn) token i en session och omdirigerar till sig själv för att presentera lösenordsändringsformuläret för användaren utan token i URL.update_session_auth_hash()
roterar nu sessionsnyckeln för att tillåta en lösenordsändring för att ogiltigförklara stulna sessionskakor.Det nya attributet
success_url_allowed_hosts
förLoginView
ochLogoutView
gör det möjligt att ange en uppsättning värdar som är säkra för omdirigering efter inloggning och utloggning.Lagt till lösenordsvaliderare
help_text
iUserCreationForm
.HttpRequest
skickas nu tillauthenticate`()
som i sin tur skickar det till autentiseringsbackend om det accepterar ettrequest
argument.Signalen
user_login_failed()
får nu ettrequest
argument.PasswordResetForm
stöder anpassade användarmodeller som använder ett e-postfält som heter något annat än'email'
. Ställ inCustomUser.EMAIL_FIELD
till namnet på fältet.get_user_model()
kan nu anropas vid importtillfället, även i moduler som definierar modeller.
django.contrib.contenttypes
¶
När inaktuella innehållstyper upptäcks i kommandot
remove_stale_contenttypes
, finns det nu en lista över relaterade objekt somauth.Permission
som också kommer att raderas. Tidigare listades endast innehållstyperna (och den här prompten fanns eftermigrate
i stället för i ett separat kommando).
django.contrib.gis
¶
De nya metoderna
GEOSGeometry.from_gml()
ochOGRGeometry.from_gml()
gör det möjligt att skapa geometrier från GML.Lagt till stöd för
dwithin
lookup på SpatiaLite.Funktionerna
Area
,Distance
och avståndsuppslagningar fungerar nu med geodetiska koordinater på SpatiaLite.De OpenLayers-baserade formulärwidgetarna använder nu
OpenLayers.js
frånhttps://cdnjs.cloudflare.com
, vilket är mer lämpligt för produktionsanvändning än den gamla källanhttps://openlayers.org/
. De är också uppdaterade för att använda OpenLayers 3.PostGIS-migreringar kan nu ändra fältdimensioner.
Lagt till möjligheten att skicka parametrarna
size
,shape
ochoffset
när du skaparGDALRaster
-objekt.Lagt till SpatiaLite-stöd för
IsValid
-funktionen,MakeValid
-funktionen ochisvalid
lookup.Lagt till Oracle-stöd för funktionen
AsGML
,BoundingCircle
,IsValid
ochisvalid
.
django.contrib.postgres
¶
Det nya argumentet
distinct
förStringAgg
avgör om sammanlänkade värden ska vara distinkta.De nya klasserna
GinIndex
ochBrinIndex
gör det möjligt att skapaGIN
ochBRIN
index i databasen.django.contrib.postgres.fields.JSONField
accepterar en nyencoder
parameter för att ange en anpassad klass för att koda datatyper som inte stöds av standardkodaren.Den nya
CIText
mixin ochCITextExtension
migration operation tillåter användning av PostgreSQLcitext
förlängning för skiftlägesokänsliga uppslagningar. Tre fält tillhandahålls:CICharField
,CIEmailField
ochCITextField
.Den nya
JSONBAgg
tillåter aggregering av värden som en JSON-array.HStoreField
(modellfält) ochHStoreField
(formulärfält) tillåter lagring av nollvärden.
Cache¶
Memcached-backends skickar nu innehållet i
OPTIONS
som nyckelordsargument till klientkonstruktörerna, vilket möjliggör mer avancerad kontroll av klientbeteendet. Se cache arguments dokumentation för exempel.Memcached-backends tillåter nu att flera servrar definieras som en kommaseparerad sträng i
LOCATION
, för att underlätta för tredjepartstjänster som använder sådana strängar i miljövariabler.
CSRF¶
Lagt till inställningen
CSRF_USE_SESSIONS
för att tillåta lagring av CSRF-token i användarens session i stället för i en cookie.
Databas backends¶
Lade till `` skip_locked`` argumentet till :meth: .QuerySet.select_for_update() ` på PostgreSQL 9.5+ och Oracle för att köra frågor med ` FOR UPDATE SKIP LOCKED``.
Lade till inställningen
TEST['TEMPLATE']
för att låta PostgreSQL-användare ange en mall för att skapa testdatabasen.QuerySet.iterator()
` använder nu server-side cursors på PostgreSQL. Denna funktion överför en del av arbetsminnesbelastningen (som används för att hålla frågeresultat) till databasen och kan öka databasminnesanvändningen.Lagt till MySQL-stöd för alternativet
'isolation_level'
iOPTIONS
för att göra det möjligt att ange transaktionens isoleringsnivå. För att undvika eventuell dataförlust rekommenderas att du byter från MySQL:s standardnivå, repeterbar läsning, till read committed.Lagt till stöd för
cx_Oracle
5.3.
E-postadress¶
Lagt till inställningen
EMAIL_USE_LOCALTIME
för att tillåta att SMTP-datohuvuden skickas i den lokala tidszonen i stället för UTC.EmailMessage.attach()
ochattach_file()
faller nu tillbaka till MIME-typen application/octet-stream när binärt innehåll som inte kan avkodas som UTF-8 anges för en text/*-bilaga.
Fil delning¶
För att göra den omslutningsbar av
io.TextIOWrapper
, harFile
nu metodernareadable()
,writable()
ochseekable()
.
Formulär¶
Det nya attributet
empty_value
påCharField
,EmailField
,RegexField
,SlugField
ochURLField
gör det möjligt att ange Python-värdet som ska användas för att representera ”empty”.Den nya
Form.get_initial_for_field()
-metoden returnerar initialdata för ett formulärfält.
Internationalisering¶
Nummerformatering och inställningen
NUMBER_GROUPING
stöder icke-enhetlig siffergruppering.
Kommandon för hantering¶
Det nya alternativet
loaddata --exclude
gör det möjligt att utesluta modeller och appar när data laddas från fixturer.Det nya alternativet
diffsettings --default
gör det möjligt att ange en annan inställningsmodul än Djangos standardinställningar att jämföra mot.argumenten i
app_label
begränsar nu utdata förshowmigrations --plan
.
Migreringar¶
Lagt till stöd för serialisering av
uuid.UUID
-objekt.
Modeller¶
Lagt till stöd för anropbara värden i argumentet
defaults
iQuerySet.update_or_create()
ochget_or_create`()
.ImageField
har nu en standardvalidate_image_file_extension
validerare. (Denna validerare flyttades till formulärfältet i Django 1.11.2.)Lagt till stöd för tidstrunkering i
Trunc
-funktioner.Lade till funktionen
ExtractWeek
för att extrahera veckan frånDateField
ochDateTimeField
och exponerade den genomweek
lookup.Lade till funktionen
TruncTime
för att trunkeraDateTimeField
till dess tidskomponent och exponerade den genomtime
lookup.Lagt till stöd för uttryck i
QuerySet.values()
ochvalues_list()
.Lagt till stöd för frågeuttryck på uppslagningar som tar flera argument, t.ex.
range
.Du kan nu använda alternativet
unique=True
medFileField
.Lade till parametrarna
nulls_first
ochnulls_last
tillExpression.asc()
ochdesc()
för att styra ordningsföljden för null-värden.De nya
F
-uttryckenbitleftshift()
ochbitrightshift()
tillåter bitvisa skiftoperationer.Lagt till
QuerySet.union()
,intersection()
ochdifference()
.
Förfrågningar och svar¶
Lagt till
QueryDict.fromkeys()
.CommonMiddleware
ställer nu in svarshuvudetContent-Length
för svar som inte strömmas.Inställningen
SECURE_HSTS_PRELOAD
lades till för att tillåta att direktivetpreload
läggs till i rubrikenStrict-Transport-Security
.ConditionalGetMiddleware
lägger nu till rubrikenETag
i svaren.
Serialisering¶
Det nya attributet
django.core.serializers.base.Serializer.stream_class
gör det möjligt för underklasser att anpassa standardströmmen.Den kodare som används av JSON serializer kan nu anpassas genom att skicka ett
cls
nyckelordsargument till funktionenserializers.serialize()
.DjangoJSONEncoder
serialiserar nutimedelta
-objekt (används avDurationField
).
Mallar¶
mark_safe()
kan nu användas som dekorator.Mallbackend
Jinja2
stöder nu kontextprocessorer genom att ställa in alternativet'context_processors'
iOPTIONS
.Taggen
regroup
returnerar nunamedtuple
istället för ordböcker så att du kan packa upp gruppobjektet direkt i en loop, t.ex.{% for grouper, list in regrouped %}
.Lagt till en
resetcycle
-malltagg för att göra det möjligt att återställa sekvensen förcycle
-malltaggen.Du kan nu ange specifika kataloger för en viss
filesystem.Loader <django.template.loaders.filesystem.Loader>`
.
Tester¶
Added
DiscoverRunner.get_test_runner_kwargs()
to allow customizing the keyword arguments passed to the test runner.Lagt till alternativet
test --debug-mode
för att underlätta felsökning av testfel genom att sätta inställningenDEBUG
tillTrue
.De nya funktionerna
django.test.utils.setup_databases()
(flyttad fråndjango.test.runner
) ochteardown_databases()
gör det enklare att bygga egna testrunners.Lagt till stöd för
unittest.TestCase.subTest()
’s vid användning avtest --parallel
.DiscoverRunner
kör nu systemkontrollerna i början av en testkörning. Åsidosätt metodenDiscoverRunner.run_checks()
om du vill inaktivera detta.
Validerare¶
Lagt till
FileExtensionValidator
för att validera filtillägg ochvalidate_image_file_extension
för att validera bildfiler.
Bakåtkompatibla ändringar i 1.11¶
django.contrib.gis
¶
För att förenkla kodbasen och för att det är lättare att installera än när
contrib.gis
först släpptes, är GDAL nu ett obligatoriskt beroende för GeoDjango. I äldre versioner krävs det endast för SQLite.contrib.gis.maps
tas bort eftersom det har ett gränssnitt mot en pensionerad version av Google Maps API och verkar vara ounderhållet. Om du använder det, :ticket:` låt oss veta <14284>`.Jämlikhetsoperatorn
GEOSGeometry
jämför nu även SRID.De OpenLayers-baserade formulärwidgetarna använder nu OpenLayers 3, och mallarna
gis/openlayers.html
ochgis/openlayers-osm.html
har uppdaterats. Kontrollera ditt projekt om du underklassar dessa widgetar eller utökar mallarna. De nya widgetarna fungerar också lite annorlunda än de gamla. Istället för att använda ett verktygsfält i widgeten klickar du för att rita, klickar och drar för att flytta kartan och klickar och drar en punkt/vertex/hörn för att flytta den.Stöd för SpatiaLite < 4.0 har tagits bort.
Stöd för GDAL 1.7 och 1.8 har tagits bort.
Widgetarna i
contrib.gis.forms.widgets
och adminsOpenLayersWidget
använder :doc:form rendering API </ref/forms/renderers>` snarare än ``loader.render_to_string()
. Om du använder en anpassad widgetmall måste du se till att din formulärrenderare kan hitta den. Du kan till exempel användaTemplatesSetting
renderer.
django.contrib.staticfiles
¶
collectstatic
kan nu misslyckas under efterbehandlingen när du använder en hashad lagring av statiska filer om det finns en referensloop (t.ex.'foo.css'
refererar till'bar.css'
som i sin tur refererar till'foo.css'
) eller om kedjan av filer som refererar till andra filer är för djup för att lösas i flera omgångar. I det senare fallet ökar du antalet passeringar medManifestStaticFilesStorage.max_post_process_passes
.När
ManifestStaticFilesStorage
används, ger statiska filer som inte finns i manifestet vid körning nu upphov till ettValueError
istället för att returnera en oförändrad sökväg. Du kan återgå till det gamla beteendet genom att ställa inManifestStaticFilesStorage.manifest_strict
tillFalse
.
Databas backend API¶
I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.
Metoden
DatabaseOperations.time_trunc_sql()
har lagts till för att stödja trunkering avTimeField
. Den accepterar argumentenlookup_type
ochfield_name
och returnerar lämplig SQL för att trunkera det angivna tidsfältetfield_name
till ett tidsobjekt med endast den angivna specificiteten. Argumentetlookup_type
kan vara antingen'hour'
,'minute'
eller'second'
.Metoden
DatabaseOperations.datetime_cast_time_sql()
har lagts till för att stödjatime
lookup. Den accepterar argumentenfield_name
ochtzname
och returnerar den SQL som krävs för att casta ett datetime-värde till ett tidsvärde.För att aktivera stöd för
FOR UPDATE SKIP LOCKED
, ställ inDatabaseFeatures.has_select_for_update_skip_locked = True
.Det nya attributet
DatabaseFeatures.supports_index_column_ordering
anger om en databas tillåter att man definierar ordningsföljd för kolumner i index. Standardvärdet ärTrue
och metodenDatabaseIntrospection.get_constraints()
bör innehålla en'orders'
-nyckel i var och en av de returnerade ordböckerna med en lista över'ASC'
och/eller'DESC'
-värden som motsvarar ordningen för varje kolumn i indexet.inspectdb
anropar inte längreDatabaseIntrospection.get_indexes()
som är föråldrad. Anpassade databasbackends bör säkerställa att alla typer av index returneras avDatabaseIntrospection.get_constraints()
.Döpte om funktionen
ignores_quoted_identifier_case
tillignores_table_name_case
för att mer exakt återspegla hur den används.Nyckelordsargumentet
name
läggs till i metodenDatabaseWrapper.create_cursor(self, name=None)
för att tillåta användning av markörer på serversidan på backends som stöder det.
Slopat stöd för PostgreSQL 9.2 och PostGIS 2.0¶
Uppströmsstöd för PostgreSQL 9.2 slutar i september 2017. Som en följd av detta ställer Django 1.11 PostgreSQL 9.3 som den minsta version som den officiellt stöder.
Stöd för PostGIS 2.0 tas också bort eftersom PostgreSQL 9.2 är den sista versionen som stöder den.
Dessutom har den minsta versionen av psycopg2 som stöds ökats från 2.4.5 till 2.5.4.
LiveServerTestCase
binder till port noll¶
Istället för att ta ett portintervall och iterera för att hitta en ledig port, binder LiveServerTestCase
till port noll och förlitar sig på att operativsystemet tilldelar en ledig port. Miljövariabeln DJANGO_LIVE_TEST_SERVER_ADDRESS
används inte längre, och eftersom den inte heller används längre, tas alternativet manage.py test --liveserver
bort.
Om du behöver binda LiveServerTestCase
till en specifik port, använd attributet port
som lades till i Django 1.11.2.
Skydd mot osäkra omdirigeringar i django.contrib.auth
och i18n
-vyer¶
LoginView
, LogoutView
(och de föråldrade funktionsbaserade motsvarigheterna) och set_language()
skyddar användare från att omdirigeras till icke-HTTPS next
URL:er när appen körs över HTTPS.
QuerySet.get_or_create()
och update_or_create()
validerar argument¶
För att förhindra att typfel passerar tyst kontrollerar get_or_create()
och update_or_create()
att deras argument är modellfält. Detta bör vara bakåtkompatibelt endast i det faktum att det kan avslöja en bugg i ditt projekt.
pytz
är ett obligatoriskt beroende och stöd för settings.TIME_ZONE = None
har tagits bort¶
För att förenkla Djangos hantering av tidszoner är pytz
nu ett nödvändigt beroende. Det installeras automatiskt tillsammans med Django.
Stöd för settings.TIME_ZONE = None
tas bort eftersom beteendet inte används ofta och är tveksamt användbart. Om du automatiskt vill upptäcka tidszonen baserat på systemets tidszon kan du använda tzlocal:
from tzlocal import get_localzone
TIME_ZONE = get_localzone().zone
Detta fungerar på liknande sätt som settings.TIME_ZONE = None
förutom att det också ställer in os.environ['TZ']
. låt oss veta <https://groups.google.com/g/django-developers/c/OAV3FChfuPM/discussion>`__ om det finns ett användningsfall där du upptäcker att du inte kan anpassa din kod för att ställa in en TIME_ZONE
.
HTML-ändringar i admin-mallar¶
<p class="help">
ersätts med en <div>
tagg för att göra det möjligt att inkludera listor i hjälptexten.
Skrivskyddade fält omsluts av .<div class="readonly">.</div>.
istället för .<p>.</p>.
för att tillåta alla typer av HTML som innehåll i fältet.
Ändringar till följd av införandet av mallbaserad widgetrendering¶
Vissa odokumenterade klasser i django.forms.widgets
har tagits bort:
SubWidget
RendererMixin
,ChoiceFieldRenderer
,RadioFieldRenderer
,CheckboxFieldRenderer
ChoiceInput
,RadioChoiceInput
,CheckboxChoiceInput
Den odokumenterade metoden Select.render_option()
har tagits bort.
Metoden Widget.format_output()
har tagits bort. Använd en anpassad widgetmall istället.
Vissa widgetvärden, till exempel alternativen <select>
, är nu lokaliserade om ettings.USE_L10N=True
. Du kan återgå till det gamla beteendet med anpassade widgetmallar som använder localize
-malltaggen för att stänga av lokalisering.
django.template.backends.django.Template.render()
förbjuder icke-dict sammanhang¶
För kompatibilitet med flera mallmotorer måste django.template.backends.django.Template.render()
(returneras från högnivå API:er för mallladdare som loader.get_template()
) ta emot en ordbok av kontext snarare än Context
eller RequestContext
. Om du skulle skicka någon av de två klasserna, skicka en ordbok istället - att göra det är bakåtkompatibelt med äldre versioner av Django.
Modellera tillståndsändringar i migreringsoperationer¶
För att göra migreringar snabbare fördröjs rendering av relaterade modeller tills en åtgärd som behöver dem (t.ex. RunPython
). Om du har en anpassad operation som arbetar med modellklasser eller modellinstanser från argumentet from_state
i database_forwards()
eller database_backwards()
, måste du rendera modelltillstånd med metoden clear_delayed_apps_cache()
enligt beskrivningen i :ref:writing your own migration operation <writing-your-own-migration-operation>
.
Markörer på serversidan på PostgreSQL¶
Ändringen för att göra QuerySet.iterator()
använda markörer på serversidan på PostgreSQL förhindrar att Django körs med PgBouncer i transaktionspoolningsläge. För att tillåta det igen, använd DISABLE_SERVER_SIDE_CURSORS
(tillagd i Django 1.11.1) i DATABASES
.
Se Transaktionspoolning och cursorer på serversidan för mer information.
Diverse¶
Om inga objekt i flödet har attributen
pubdate
ellerupdateddate
returnerarSyndicationFeed.latest_post_date()
nu aktuellt UTC-datum/tid istället för en datetime utan information om tidszon.CSRF-misslyckanden loggas i
django.security.csrf
-loggern istället fördjango.request
.valideringen av
ALLOWED_HOSTS
är inte längre inaktiverad när tester körs. Om ditt program innehåller tester med anpassade värdnamn måste du inkludera dessa värdnamn iALLOWED_HOSTS
. Se Tester och flera värdnamn.Om du använder en främmande nyckels ID (t.ex.
'field_id'
) iModelAdmin.list_display
visas det relaterade objektets ID. Ta bort suffixet_id
om du vill ha det gamla beteendet för strängrepresentationen av objektet.I modellformulär sparar
CharField
mednull=True
nuNULL
för tomma värden istället för tomma strängar.På Oracle kontrollerar
Model.validate_unique()
inte längre tomma strängar för unikhet eftersom databasen tolkar värdet somNULL
.Om du underklassar
AbstractUser
och åsidosätterclean()
, se till att den anroparsuper()
.BaseUserManager.normalize_email()
anropas i en nyAbstractUser.clean()
-metod så att normalisering tillämpas i fall som validering av modellformulär.EmailField
ochURLField
accepterar inte längre nyckelordsargumentetstrip
. Ta bort det eftersom det inte har någon effekt i äldre versioner av Django eftersom dessa fält alltid tar bort blanksteg.Attributen
checked
ochselected
som återges av formulärwidgets använder nu HTML5:s booleska syntax i stället för XHTML:schecked='checked'
ochselected='selected'
.RelatedManager.add()
,remove()
,clear()
, ochset()
rensar nuprefetch_related()
-cachen.För att förhindra eventuell förlust av sparade inställningar ger
setup_test_environment()
nu upphov till ett undantag om den anropas en andra gång innanteardown_test_environment()
anropas.Det odokumenterade aliaset
DateTimeAwareJSONEncoder
förDjangoJSONEncoder
(bytt namn i Django 1.0) tas bort.cached template loader
är nu aktiverad omOPTIONS['loaders']
inte är specificerad ochOPTIONS['debug']
ärFalse
(det senare alternativet är standardvärdet förDEBUG
). Detta kan vara bakåtkompatibelt om du har några template-taggar som inte är trådsäkra.Prompten för borttagning av inaktuella innehållstyper visas inte längre efter att kommandot
migrate
har körts. Använd det nya kommandotremove_stale_contenttypes
istället.Administratörens widget för
IntegerField
användertype="number"
i stället förtype="text"
.Villkorliga HTTP-rubriker analyseras och jämförs nu i enlighet med RFC 7232 Conditional Requests-specifikationen i stället för den äldre RFC 2616.
patch_response_headers()
lägger inte längre till enLast-Modified
header. Enligt RFC 7234 Section 4.2.2 är denna rubrik värdelös tillsammans med andra cache-rubriker som ger en explicit utgångstid, t.ex.Expires
ellerCache-Control
.UpdateCacheMiddleware
ochadd_never_cache_headers()
anroparpatch_response_headers()
och påverkas därför också av denna ändring.I adminmallarna ersätts
<p class="help">
med en<div>
tagg för att möjliggöra inkludering av listor i hjälptexten.ConditionalGetMiddleware
anger inte längre rubrikenDate
eftersom webbservrar anger den rubriken. Den ställer inte heller längre in rubrikenContent-Length
eftersom detta nu görs avCommonMiddleware
.Om du har ett mellanprogram som ändrar innehållet i ett svar och som visas före
CommonMiddleware
i inställningarnaMIDDLEWARE
ellerMIDDLEWARE_CLASSES
måste du ändra ordningen på mellanprogrammet så att svaren inte ändras efter attContent-Length
har angetts, eller låta det mellanprogram som ändrar svaret återställa rubrikenContent-Length
.get_model()
ochget_models()
ger nu upphov tillAppRegistryNotReady
om de anropas innan modeller för alla applikationer har laddats. Tidigare krävde de bara att målapplikationens modeller skulle laddas och kunde därför returnera modeller utan att alla deras relationer var inställda. Om du behöver det gamla beteendet hosget_model()
, sätt argumentetrequire_ready
tillFalse
.Det oanvända attributet
BaseCommand.can_import_settings
har tagits bort.Den odokumenterade
django.utils.functional.lazy_property
tas bort.För konsekvens med icke-multipart-förfrågningar,
MultiPartParser.parse()
lämnar nurequest.POST
oföränderlig. Om du ändrar denQueryDict
, måste du nu först kopiera den, t.ex.request.POST.copy()
.Stöd för
cx_Oracle
< 5.2 har tagits bort.Stöd för IPython < 1.0 har tagits bort från kommandot
shell
.Signaturen för det privata API:et
Widget.build_attrs()
ändrades frånextra_attrs=None, **kwargs
tillbase_attrs, extra_attrs=None
.Filliknande objekt (t.ex.
StringIO
ochBytesIO
) som laddas upp till enImageField
med hjälp av testklienten kräver nu ettname
-attribut med ett värde som passerarvalidate_image_file_extension
-validatorn. Se anmärkningen iClient.post()
.FileField
flyttar nu snarare än kopierar den fil den tar emot. Med standardinställningarna för filuppladdning har filer som är större änFILE_UPLOAD_MAX_MEMORY_SIZE
nu samma behörigheter som temporära filer (ofta0o600
) i stället för systemets standard-umask (ofta0o6644
). Ange :inställningen:`FILE_UPLOAD_PERMISSIONS` om du vill ha samma behörighet oavsett filstorlek.
Funktioner som inte längre är aktuella i 1.11¶
modeller.permalink()
dekorator¶
Använd django.urls.reverse()
istället. Till exempel:
from django.db import models
class MyModel(models.Model):
...
@models.permalink
def url(self):
return ("guitarist_detail", [self.slug])
blir:
from django.db import models
from django.urls import reverse
class MyModel(models.Model):
...
def url(self):
return reverse("guitarist_detail", args=[self.slug])
Diverse¶
contrib.auth
’s funktionsbaserade vyerlogin()
ochlogout()
är avförda till förmån för nya klassbaserade vyerLoginView
ochLogoutView
.Den oanvända parametern
extra_context
icontrib.auth.views.logout_then_login()
är föråldrad.contrib.auth
:s funktionsbaserade vyerpassword_change()
,password_change_done()
,password_reset()
,password_reset_done()
,password_reset_confirm()
ochpassword_reset_complete()
är föråldrade till förmån för nya klassbaserade vyerPasswordChangeView
,PasswordChangeDoneView
,PasswordResetView
,PasswordResetDoneView
,PasswordResetConfirmView
, ochPasswordResetCompleteView
.django.test.runner.setup_databases()
flyttas tilldjango.test.utils.setup_databases()
. Den gamla platsen är föråldrad.django.utils.translation.string_concat()
är föråldrad till förmån fördjango.utils.text.format_lazy()
.string_concat(*strings)
kan ersättas avformat_lazy('{}' * len(strings), *strings)
.För cache-backend
PyLibMCCache
är det föråldrat att skickapylibmc
beteendeinställningar som toppnivåattribut förOPTIONS
. Ställ in dem under enbehaviors
nyckel inomOPTIONS
istället.Parametern
host
idjango.utils.http.is_safe_url()
är föråldrad till förmån för den nya parameternallowed_hosts
.Att tysta undantag som uppstår vid rendering av
{% include %}
malltagg är avskriven eftersom beteendet ofta är mer förvirrande än hjälpsamt. I Django 2.1 kommer undantaget att tas upp.DatabaseIntrospection.get_indexes()
är föråldrad till förmån förDatabaseIntrospection.get_constraints()
.authenticate()
skickar nu ettrequest
-argument tillauthenticate()
-metoden för autentiseringsbackends. Stöd för metoder som inte accepterarrequest
som det första positionella argumentet kommer att tas bort i Django 2.1.Inställningen
USE_ETAGS
är utfasad till förmån förConditionalGetMiddleware`
som nu lägger tillETag
-rubriken till svar oavsett inställning.CommonMiddleware
ochdjango.utils.cache.patch_response_headers()
kommer inte längre att ställa in ETags när föråldringen upphör.Model._meta.has_auto_field
är föråldrad till förmån för att kontrollera omModel._meta.auto_field is not None
.Att använda grupper av reguljära uttryck med
iLmsu#
iurl()
är föråldrat. Den enda gruppen som är användbar är(?i)
för skiftlägesokänsliga webbadresser, men skiftlägesokänsliga webbadresser är inte en bra praxis eftersom de skapar flera poster för sökmotorer, till exempel. En alternativ lösning kan vara att skapa enhandler404
som letar efter versaler i URL:en och omdirigerar till en motsvarighet med gemener.Argumentet
renderer
läggs till i metodenWidget.render()
. Metoder som inte accepterar det argumentet kommer att fungera under en utfasningsperiod.