Django 1.8 release notes¶
1 april 2015
Välkommen till Django 1.8!
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.7 eller äldre versioner. Vi har också börjat utfasningsprocessen för vissa funktioner, och vissa funktioner har nått slutet av sin utfasningsprocess och har tagits bort.
Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.
Django 1.8 har utsetts till Djangos andra long-term support release. Den kommer att få säkerhetsuppdateringar i minst tre år efter lanseringen. Support för den tidigare LTS, Django 1.4, kommer att upphöra 6 månader från utgivningsdatumet för Django 1.8.
Kompatibilitet med Python¶
Django 1.8 kräver Python 2.7, 3.2, 3.3, 3.4 eller 3.5. Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.
Django 1.8 är den första utgåvan som stöder Python 3.5.
På grund av att uppströmsstödet för Python 3.2 upphörde i februari 2016 kommer vi inte att testa Django 1.8.x på Python 3.2 efter slutet av 2016.
Vad är nytt i Django 1.8¶
aPI för Model._meta
¶
Django har nu ett formaliserat API för Model._meta, vilket ger ett officiellt stöd för att hämta fält och filtrera fält baserat på deras attribut.
Objektet Model._meta
har varit en del av Django sedan dagarna före 0.96 ”Magic Removal” - det var bara inte ett officiellt, stabilt API. Som ett erkännande av detta har vi strävat efter att upprätthålla bakåtkompatibilitet med den gamla API-slutpunkten där det är möjligt. API-slutpunkter som inte är en del av det nya officiella API:et har dock föråldrats och kommer så småningom att tas bort.
Flera mallmotorer¶
Django 1.8 definierar ett stabilt API för integrering av mallbackends. Det innehåller inbyggt stöd för Djangos mallspråk och för Jinja2
. Det stöder rendering av mallar med flera motorer inom samma projekt. Läs mer om de nya funktionerna i topic guide och kontrollera uppgraderingsinstruktionerna i äldre versioner av dokumentationen.
Förbättringar av säkerheten¶
Flera funktioner i tredjepartsbiblioteket django-secure har integrerats i Django. django.middleware.security.SecurityMiddleware
ger flera säkerhetsförbättringar i request/response-cykeln. Det nya check --deploy
-alternativet låter dig kontrollera din produktionsinställningsfil för sätt att öka säkerheten på din webbplats.
Ny PostgreSQL-specifik funktionalitet¶
Django har nu en modul med tillägg för PostgreSQL-specifika funktioner, såsom ArrayField
, HStoreField
, Område Fält och unaccent
lookup. En fullständig uppdelning av funktionerna finns i dokumentationen.
Nya datatyper¶
Django har nu en
UUIDField
för lagring av universellt unika identifierare. Den lagras som den ursprungliga datatypenuuid
på PostgreSQL och som ett teckenfält med fast längd på andra backends. Det finns en motsvarandeformfält
.Django har nu en
DurationField
för lagring av tidsperioder - modellerad i Python avtimedelta
. Den lagras i den ursprungliga datatypenintervall
på PostgreSQL, som enINTERVAL DAY(9) TO SECOND(6) `` på Oracle och som en ``bigint
av mikrosekunder på andra backends. Datum- och tidsrelaterad aritmetik har också förbättrats på alla backends. Det finns en motsvarandeformulärsfält
.
Frågeuttryck, villkorsuttryck och databasfunktioner¶
Query Expressions gör att du kan skapa, anpassa och komponera komplexa SQL-uttryck. Detta har gjort det möjligt för Annotate att acceptera andra uttryck än aggregat. Aggregat kan nu referera till flera fält samt utföra aritmetik, liknande F()
-objekt. order_by()
har också fått möjlighet att acceptera uttryck.
Conditional Expressions gör att du kan använda if
… elif
… else
logik inom frågor.
En samling av databasfunktioner ingår också med funktionalitet som Coalesce
, Concat
och Substr
.
uppsättning av TestCase
-data¶
TestCase
har omarbetats för att möjliggöra datainitialisering på klassnivå med hjälp av transaktioner och savepoints. Databasbackends som inte stöder transaktioner, som MySQL med MyISAM-lagringsmotorn, kommer fortfarande att kunna köra dessa tester men kommer inte att dra nytta av förbättringarna. Testerna körs nu inom två nästlade atomic()
-block: ett för hela klassen och ett för varje test.
Klassmetoden
TestCase.setUpTestData()
ger möjlighet att ställa in testdata på klassnivå. Att använda denna teknik kan påskynda testerna jämfört med att användasetUp()
.Laddning av fixturer inom
TestCase
utförs nu en gång för helaTestCase
.
Mindre funktioner¶
django.contrib.admin
¶
ModelAdmin
har nu enhas_module_permission()
-metod för att tillåta begränsning av åtkomst till modulen på adminindexsidan.InlineModelAdmin
har nu ett attributshow_change_link
som stöder visning av en länk till ett inline-objekts ändringsformulär.Använd det nya
django.contrib.admin.RelatedOnlyFieldListFilter
iModelAdmin.list_filter
för att begränsalist_filter
-valen till främmande objekt som är kopplade till dem frånModelAdmin
.Metoden
ModelAdmin.delete_view()
visar en sammanfattning av objekt som ska raderas på sidan för bekräftelse av radering.Det jQuery-bibliotek som är inbäddat i admin har uppgraderats till version 1.11.2.
Du kan nu ange
AdminSite.site_url
för att visa en länk till frontend-webbplatsen.Du kan nu ange
ModelAdmin.show_full_result_count
för att styra om hela antalet objekt ska visas på en filtrerad adminsida eller inte.Metoden
AdminSite.password_change()
har nu en parameter förextra_context
.Du kan nu styra vem som får logga in på adminsidan genom att åsidosätta endast
AdminSite.has_permission()
ochAdminSite.login_form
. Mallenbase.html
har ett nytt blockusertools
som innehåller det användarspecifika sidhuvudet. En ny kontextvariabelhas_permission
, som får sitt värde frånhas_permission()
, anger om användaren kan komma åt webbplatsen.I rullgardinsmenyer för främmande nycklar finns nu knappar för att ändra eller ta bort relaterade objekt med hjälp av en popup.
django.contrib.admindocs
¶
reStructuredText tolkas nu i modelldokumentationer.
django.contrib.auth
¶
Auktoriseringsbackends kan nu höja
PermissionDenied
ihas_perm()
ochhas_module_perms()
för att kortsluta behörighetskontrollen.PasswordResetForm
har nu en metodsend_mail()
som kan åsidosättas för att anpassa det e-postmeddelande som ska skickas.Den
max_length
avPermission.name
har ökats från 50 till 255 tecken. Kör databasmigreringen.USERNAME_FIELD
ochREQUIRED_FIELDS
stöder nuForeignKey
.Standardantalet iterationer för PBKDF2-lösenordshasher har ökats med 33%. Denna bakåtkompatibla ändring kommer inte att påverka användare som har underklassat
django.contrib.auth.hashers.PBKDF2PasswordHasher
för att ändra standardvärdet.
django.contrib.gis
¶
En ny GeoJSON serializer är nu tillgänglig.
Det är nu tillåtet att inkludera en underfråga som ett geografiskt uppslagsargument, t.ex.
City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly'))
.SpatiaLite backend stöder nu aggregaten
Collect
ochExtent
när databasversionen är 3.0 eller senare.Initialiseringskommandona PostGIS 2
CREATE EXTENSION postgis
och SpatiaLiteSELECT InitSpatialMetaData
körs nu automatiskt avmigrate
.GDAL-gränssnittet stöder nu hämtning av egenskaper för raster (bild) datafil.
Kompatibilitetsshims för
SpatialRefSys
ochGeometryColumns
som ändrades i Django 1.2 har tagits bort.Alla GDAL-relaterade undantag tas nu upp med
GDALException
. Den tidigareOGRException
har behållits för bakåtkompatibilitet men bör inte användas längre.
django.contrib.sessions
¶
Sessionscookien raderas nu efter att
flush()
har anropats.
django.contrib.sitemaps
¶
Med det nya attributet
Sitemap.i18n
kan du generera en webbplatskarta baserat på inställningenLANGUAGES
.
django.contrib.sites
¶
get_current_site()
kommer nu att söka upp den aktuella webbplatsen baserat pårequest.get_host()
om inställningenSITE_ID
inte är definierad.Standardklassen
Site
som skapas när man körmigrate
respekterar nu inställningenSITE_ID
(istället för att alltid användapk=1
).
Cache¶
Metoden
incr()
för backenddjango.core.cache.backends.locmem.LocMemCache
är nu trådsäker.
Kryptografi¶
Parametern
max_age
i metodendjango.core.signing.TimestampSigner.unsign()
accepterar nu även ettdatetime.timedelta
-objekt.
Databas backends¶
MySQL-backend tar inte längre bort mikrosekunder från
datetime
-värden eftersom MySQL 5.6.4 och senare stöder bråkdelar av sekunder beroende på deklarationen av datetime-fältet (närDATETIME
innehåller bråkdelar med precision större än 0). Nya datetime-databaskolumner som skapats med Django 1.8 och MySQL 5.6.4 och senare kommer att stödja mikrosekunder. Se MySQL database notes för mer information.MySQL-backend skapar inte längre explicita index för utländska nycklar när InnoDB-lagringsmotorn används, eftersom MySQL redan skapar dem automatiskt.
Oracles backend definierar inte längre funktionen
connection_persists_old_columns
somTrue
. Istället kommer Oracle nu att inkludera en cache-busting-klausul när beskrivningen av en tabell hämtas.
E-postadress¶
:ref:
E-postbackends <topic-email-backends>
stöder nu protokollet context manager för att öppna och stänga anslutningar.SMTP-backend för e-post stöder nu autentisering med
keyfile
ochcertfile
med inställningarnaEMAIL_SSL_CERTFILE
ochEMAIL_SSL_KEYFILE
.SMTP
EmailBackend
stöder nu inställning av parameterntimeout
med inställningenEMAIL_TIMEOUT
.EmailMessage
ochEmailMultiAlternatives
har nu stöd för parameternreply_to
.
Fil delning¶
Storage.get_available_name()
ochStorage.save()
tar nu ettmax_length
-argument för att implementera begränsningar för maximal filnamnslängd på lagringsnivå. Filnamn som överskrider detta argument kommer att avkortas. Detta förhindrar ett databasfel när man lägger till ett unikt suffix till ett långt filnamn som redan finns på lagringsenheten. Se :ref:``deprecation note <storage-max-length-update>` om hur du lägger till detta argument i dina anpassade lagringsklasser.
Formulär¶
Formulärwidgets återger nu attribut med värdet
True
ellerFalse
som booleska HTML5-attribut.Den nya metoden
has_error()
gör det möjligt att kontrollera om ett specifikt fel har inträffat.Om
required_css_class
definieras på ett formulär, kommer taggarna<label>
för obligatoriska fält att ha denna klass i sina attribut.Renderingen av icke-fältfel i oordnade listor (
<ul>
) inkluderar nunonfield
i sin lista över klasser för att skilja dem från fältspecifika fel.Field
accepterar nu ettlabel_suffix
-argument, som kommer att åsidosätta formuläretslabel_suffix
. Detta gör det möjligt att anpassa suffixet per fält - tidigare var det inte möjligt att åsidosätta ett formulärslabel_suffix
när man använde genvägar som{{ form.as_p }}
i mallar.SelectDateWidget
accepterar nu ettempty_label
-argument, som kommer att åsidosätta etiketten för topplistans val närDateField
inte krävs.När en
ImageField
har rensats och validerats kommer objektetUploadedFile
att ha ett ytterligareimage
-attribut som innehåller PillowImage
-instansen som används för att kontrollera om filen var en giltig bild. Det kommer också att uppdateraUploadedFile.content_type
med bildens innehållstyp som bestäms av Pillow.Du kan nu skicka en callable som returnerar en iterabel av val när du instansierar en
ChoiceField
.
Generiska åsikter¶
Generiska vyer som använder
MultipleObjectMixin
kan nu ange den ordning som tillämpas påqueryset
genom att ställa inordering
eller åsidosättaget_ordering()
.Det nya attributet
SingleObjectMixin.query_pk_and_slug
gör det möjligt att ändra beteendet hosget_object()
så att den utför sin sökning med hjälp av både primärnyckeln och sluggen.Metoden
get_form()
kräver inte längre att enform_class
anges. Om den inte anges ärform_class
standardvärdetget_form_class()
.Platshållare i
ModelFormMixin.success_url
stöder nu Pythonstr.format()
syntax. Den äldre syntaxen%(<foo>)s
stöds fortfarande men kommer att tas bort i Django 1.10.
Internationalisering¶
FORMAT_MODULE_PATH
kan nu vara en lista med strängar som representerar sökvägar till moduler. Detta gör det möjligt att importera flera formatmoduler från olika återanvändbara appar. Det gör det också möjligt att åsidosätta dessa anpassade format i ditt huvudsakliga Django-projekt.
Loggning¶
Klassen
django.utils.log.AdminEmailHandler
har nu ensend_mail()
-metod för att göra den mer underklassvänlig.
Kommandon för hantering¶
Databasanslutningar stängs nu alltid efter att ett hanteringskommando som anropas från kommandoraden har slutfört sitt arbete.
Kommandon från alternativa paketformat som eggs upptäcks nu också.
Det nya alternativet
dumpdata --output
gör det möjligt att ange en fil till vilken de serialiserade data skrivs.De nya alternativen
makemessages --exclude
ochcompilemessages --exclude
gör det möjligt att utesluta specifika lokaliteter från bearbetning.compilemessages
har nu ett--use-fuzzy
eller-f
alternativ som inkluderar fuzzy-översättningar i kompilerade filer.Alternativet
loaddata --ignorenonexistent
ignorerar nu data för modeller som inte längre finns.runserver
använder nu daemon-trådar för snabbare laddning.inspectdb
ger nu utMeta.unique_together
. Det går också att introspekteraAutoField
för MySQL- och PostgreSQL-databaser.När man anropar hanteringskommandon med alternativ med
call_command()
kan alternativnamnet matcha kommandoradens alternativnamn (utan de inledande bindestrecken) eller det slutliga variabelnamnet för alternativets destination, men i båda fallen är det resulterande alternativet som tas emot av kommandot nu alltid namnetdest
som anges i kommandots alternativdefinition (så länge kommandot använder modulenargparse
).Kommandot
dbshell
stöder nu MySQL:s valfria inställning för SSL-certifikatutfärdare (--ssl-ca
).Det nya
makemigrations --name
gör det möjligt att ge migreringarna ett eget namn i stället för ett genererat namn.Kommandot
loaddata
förhindrar nu upprepad laddning av fixturer. OmFIXTURE_DIRS
innehåller dubbletter eller en standardkatalog för fixturer (app_name/fixtures
), kommer ett undantag att göras.Det nya alternativet
makemigrations --exit
gör det möjligt att avsluta med en felkod om inga migreringar skapas.Med det nya kommandot
showmigrations
kan du lista alla migreringar och deras beroenden i ett projekt.
Middleware¶
Med attributet
CommonMiddleware.response_redirect_class
kan du anpassa de omdirigeringar som utfärdas av mellanvaran.Ett felsökningsmeddelande kommer att loggas till
django.request
logger när en middleware ger upphov till ettMiddlewareNotUsed
undantag iDEBUG
-läge.
Migreringar¶
Operationen
RunSQL
kan nu hantera parametrar som skickas till SQL-satserna.Det är nu möjligt att ha migreringar (troligen datamigreringar) för applikationer utan modeller.
Migreringar kan nu serialisera modellhanterare som en del av modelltillståndet.
En generisk mekanism för att hantera borttagandet av modellfält lades till.
Klassmetoden/attributet
RunPython.noop()
ochRunSQL.noop
lades till för att underlätta att göraRunPython
ochRunSQL
-operationer reversibla.Migreringsoperationerna
RunPython
ochRunSQL
anropar nu metodenallow_migrate()
för databasroutrar. Routern kan använda de nyligen introducerade argumentenapp_label
ochhints
för att fatta ett routningsbeslut. För att dra nytta av den här funktionen måste du uppdatera routern till den nyaallow_migrate
-signaturen, se :ref:``deprecation section <deprecated-signature-of-allow-migrate>` för mer information.
Modeller¶
Django loggar nu högst 9000 förfrågningar i
connections.queries
, för att förhindra överdriven minnesanvändning i långvariga processer i felsökningsläge.Det finns nu ett alternativ för modellen
Meta
för att definiera enstandardrelaterat namn
för alla relationsfält i en modell.Pickling av modeller och querysets över olika versioner av Django stöds inte officiellt (det kan fungera, men det finns ingen garanti). En extra variabel som anger den aktuella Django-versionen läggs nu till i det inlagda tillståndet för modeller och querysets, och Django ger upphov till en
RuntimeWarning
när dessa objekt avplockas i en annan version än den där de inplockades.Lagt till
Model.from_db()
som Django använder när objekt laddas med hjälp av ORM. Metoden gör det möjligt att anpassa modellens laddningsbeteende.med
extra(select={...})
kan du nu undkomma en bokstavlig%s
-sekvens med hjälp av%%s
.Custom Lookups kan nu registreras med hjälp av ett dekoratormönster.
Det nya attributet
Transform.bilateral
gör det möjligt att skapa bilaterala transformationer. Dessa transformationer tillämpas på bådelhs
ochrhs
när de används i ett uppslagsuttryck, vilket ger möjligheter till mer sofistikerade uppslagningar.SQL-specialtecken (, %, _) escapas nu korrekt när en mönsteruppslagning (t.ex.
contains
,startswith
, etc.) används med ettF()
-uttryck som höger sida. I dessa fall utförs escapingen av databasen, vilket kan leda till något komplexa frågor som involverar nästladeREPLACE
-funktionsanrop.Du kan nu uppdatera modellinstanser genom att använda
Model.refresh_from_db()
.Du kan nu få en uppsättning uppskjutna fält för en modell med
Model.get_deferred_fields()
.Modellfältets
default
används nu när primärnyckelfältet är inställt påNone
.
Signaler¶
Undantag från
(mottagare, undantag)
-tuplerna som returneras avSignal.send_robust()
har nu sin traceback bifogad som ett__traceback__
-attribut.Argumentet
environ
, som innehåller WSGI-miljöstrukturen från begäran, lades till i signalenrequest_started
.Du kan nu importera
setting_changed()
-signalen fråndjango.core.signals
för att undvika att laddadjango.test
i situationer som inte är test. Django gör inte längre det själv.
Ramverk för systemkontroll¶
register
kan nu användas som en funktion.
Mallar¶
urlize
stöder nu länkar som endast innehåller domäner och som innehåller tecken efter toppdomänen (t.ex.djangoproject.com/
ochdjangoproject.com/download/
).urlize
behandlar inte utropstecken i slutet av en domän eller dess frågesträng som en del av URL:en (URL:en i t.ex.'djangoproject.com!
ärdjangoproject.com
)Lagt till en
locmem.Loader
-klass som laddar Django-mallar från en Python-ordbok.Taggen
now
kan nu lagra sin utdata i en kontextvariabel med den vanliga syntaxen:{% now 'j n Y' as varname %}
.
Förfrågningar och svar¶
WSGIRequest
respekterar nu sökvägar som börjar med//
.Metoden
HttpRequest.build_absolute_uri()
hanterar nu sökvägar som börjar med//
korrekt.Om
DEBUG
ärTrue
och en begäran ger upphov till enSuspiciousOperation
, kommer svaret att återges med en detaljerad felsida.Argumentet
query_string
iQueryDict
är nu valfritt, medNone
som standard, så en tomQueryDict
kan nu instansieras medQueryDict()
istället förQueryDict(None)
ellerQueryDict('')
.Attributen
GET
ochPOST
i ettHttpRequest
-objekt är nuQueryDict``er i stället för lexikon, och attributet ``FILES`
är nu enMultiValueDict
. Detta gör att denna klass överensstämmer med dokumentationen och medWSGIRequest
.Attributet
HttpResponse.charset
lades till.WSGIRequestHandler
följer nu RFC vid konvertering av URI till IRI, med hjälp avuri_to_iri()
.Metoden
HttpRequest.get_full_path()
undviker nu osäkra tecken från sökvägsdelen av en URI (Uniform Resource Identifier) på rätt sätt.HttpResponse
implementerar nu några ytterligare metoder somgetvalue()
så att instanser kan användas som strömobjekt.Den nya
HttpResponse.setdefault()
-metoden gör det möjligt att ställa in en header om den inte redan har ställts in.Du kan använda den nya
FileResponse
för att strömma filer.Dekoratorn
condition()
för villkorlig vybehandling stöder nu rubrikenIf-unmodified-since
.
Tester¶
Metoderna
RequestFactory.trace()
ochClient.trace()
implementerades, så att du kan skapaTRACE
-förfrågningar i dina tester.Argumentet
count
lades till iassertTemplateUsed()
. Detta gör att du kan hävda att en mall återgavs ett visst antal gånger.Den nya
assertJSONNotEqual()
-assertionen gör att du kan testa att två JSON-fragment inte är lika.Lagt till alternativ till kommandot
test
för att bevara testdatabasen (--keepdb
), för att köra testfallen i omvänd ordning (--reverse
) och för att aktivera SQL-loggning för misslyckade tester (--debug-sql
).Lagt till attributet
resolver_match
för att testa klientsvar.Flera inställningar har lagts till som gör det möjligt att anpassa parametrarna för testtabellutrymmen för Oracle:
DATAFILE
,DATAFILE_TMP
,DATAFILE_MAXSIZE
ochDATAFILE_TMP_MAXSIZE
.Dekoratorn
override_settings()
kan nu påverka huvudroutern iDATABASE_ROUTERS
.Lagt till stöd för testklient för filuppladdningar med filliknande objekt.
En delad cache används nu vid testning med en SQLite-databas i minnet när Python 3.4+ och SQLite 3.7.13+ används. Detta gör det möjligt att dela databasen mellan trådar.
Validerare¶
URLValidator
stöder nu IPv6-adresser, Unicode-domäner och webbadresser som innehåller autentiseringsdata.
Bakåtkompatibla ändringar i 1.8¶
Varning
Utöver de ändringar som beskrivs i det här avsnittet bör du granska deprecation plan för alla funktioner som har tagits bort. Om du inte har uppdaterat din kod inom utfasningstiden för en viss funktion kan borttagningen av den framstå som en bakåtkompatibel ändring.
Att tilldela osparade objekt till relationer ger upphov till ett fel¶
Observera
För att lättare tillåta användning av modeller i minnet, återkallades denna ändring i Django 1.8.4 och ersattes med en kontroll under model.save()
. Till exempel:
>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.save()
Traceback (most recent call last):
...
ValueError: save() prohibited to prevent data loss due to unsaved related object 'author'.
En liknande kontroll av tilldelning för att vända en-till-en-relationer togs bort i Django 1.8.5.
Tilldelning av osparade objekt till en ForeignKey
, GenericForeignKey
och OneToOneField
ger nu upphov till en ValueError
.
Tidigare ignorerades tilldelningen av ett osparat objekt i tysthet. Ett exempel:
>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.author.save()
>>> book.save()
>>> Book.objects.get(name="Django")
>>> book.author
>>>
Nu kommer ett felmeddelande att visas för att förhindra dataförlust:
>>> book.author = Author(name="john")
Traceback (most recent call last):
...
ValueError: Cannot assign "<Author: John>": "Author" instance isn't saved in the database.
Om du vill tillåta tilldelning av osparade instanser (det gamla beteendet) och inte är orolig för risken för dataförlust (t.ex. om du aldrig sparar objekten i databasen), kan du inaktivera denna kontroll genom att använda attributet ForeignKey.allow_unsaved_instance_assignment
. (Detta attribut togs bort i 1.8.4 eftersom det inte längre är relevant)
Hanteringskommandon som endast accepterar positionella argument¶
Om du har skrivit ett anpassat hanteringskommando som endast accepterar positionella argument och du inte angav kommandovariabeln args
, kan du få ett fel som Error: unrecognized arguments: ...
, eftersom variabelparsning nu baseras på argparse
som inte implicit accepterar positionella argument. Du kan göra ditt kommando bakåtkompatibelt genom att helt enkelt ställa in klassvariabeln args
. Men om du inte behöver hålla kompatibilitet med äldre Django-versioner är det bättre att implementera den nya add_arguments()
-metoden som beskrivs i Hur man skapar egna kommandon för django-admin.
Anpassade kommandoparametrar för testhantering via testrunner¶
Metoden för att lägga till anpassade argument till hanteringskommandot test
via testköraren har ändrats. Tidigare kunde du tillhandahålla en option_list
klassvariabel på testköraren för att lägga till fler argument (à la optparse
). För att implementera samma beteende måste du nu skapa en klassmetod add_arguments(cls, parser)
på testköraren och anropa parser.add_argument
för att lägga till eventuella anpassade argument, eftersom parser nu är en instans av argparse.ArgumentParser
.
Modellkontroll säkerställer att automatiskt genererade kolumnnamn ligger inom de gränser som anges av databasen¶
Ett fältnamn som är längre än kolumnnamnets längd som stöds av en databas kan skapa problem. Med MySQL får du till exempel ett undantag som försöker skapa kolumnen, och med PostgreSQL trunkeras kolumnnamnet av databasen (du kan se en varning i PostgreSQL-loggarna).
En modellkontroll har införts för att bättre varna användarna för detta scenario innan databastabellerna faktiskt skapas.
Om du har en befintlig modell där denna kontroll verkar vara en falsk positiv, till exempel på PostgreSQL där namnet redan trunkerades, använd helt enkelt db_column
för att ange namnet som används.
Kontrollen gäller även de kolumner som genereras i en implicit ManyToManyField.through
-modell. Om du stöter på problem där, använd through
för att skapa en explicit modell och ange sedan db_column
på dess kolumn(er) efter behov.
Sökningar i Query-relationer kontrollerar nu objekttyper¶
Förfrågningar om modelluppslagningar kontrollerar nu om objektet som skickas är av rätt typ och ger upphov till ett ValueError
om så inte är fallet. Tidigare brydde sig Django inte om objektet var av rätt typ; det använde bara objektets relaterade fältattribut (t.ex. id
) för uppslagningen. Nu uppstår ett fel för att förhindra felaktiga uppslagningar:
>>> book = Book.objects.create(name="Django")
>>> book = Book.objects.filter(author=book)
Traceback (most recent call last):
...
ValueError: Cannot query "<Book: Django>": Must be "Author" instance.
Standard EmailField.max_length
ökad till 254¶
Det gamla standardvärdet på 75 tecken för max_length
kunde inte lagra alla möjliga e-postadresser som uppfyller RFC3696/5321. För att kunna lagra alla möjliga giltiga e-postadresser har max_length
ökats till 254 tecken. Du måste generera och tillämpa databasmigreringar för dina berörda modeller (eller lägga till max_length=75
om du vill behålla längden på dina aktuella fält). En migrering för django.contrib.auth.models.User.email
ingår.
Stöd för PostgreSQL-versioner äldre än 9.0¶
Slutet på uppströms stödperioder nåddes i juli 2014 för PostgreSQL 8.4. Som en följd av detta ställer Django 1.8 9.0 som den minsta PostgreSQL-versionen som den officiellt stöder.
Detta inkluderar också att släppa stöd för PostGIS 1.3 och 1.4 eftersom dessa versioner inte stöds på versioner av PostgreSQL senare än 8.4.
Django kräver nu också användning av Psycopg2 version 2.4.5 eller högre (eller 2.5+ om du vill använda django.contrib.postgres
).
Stöd för MySQL-versioner äldre än 5.5¶
Slutet på uppströms stödperioder nåddes i januari 2012 för MySQL 5.0 och december 2013 för MySQL 5.1. Som en följd av detta sätter Django 1.8 5.5 som den minsta MySQL-versionen som den officiellt stöder.
Stöd för Oracle-versioner äldre än 11.1¶
Slutet på uppströms supportperioder nåddes i juli 2010 för Oracle 9.2, januari 2012 för Oracle 10.1 och juli 2013 för Oracle 10.2. Som en följd av detta sätter Django 1.8 11.1 som den minsta Oracle-versionen som den officiellt stöder.
Specifika behörigheter används i stället för roller för tester på Oracle¶
Tidigare versioner av Django gav rollerna CONNECT och RESOURCE till testanvändaren på Oracle. Dessa roller har tagits bort, så Django 1.8 använder istället de specifika underliggande behörigheterna. Detta ändrar de privilegier som krävs av huvudanvändaren för att köra tester (såvida inte projektet är konfigurerat för att undvika att skapa en testanvändare). De exakta privilegier som krävs nu beskrivs i :ref:Oracle notes <oracle-notes>
.
AbstractUser.last_login
tillåter null-värden¶
Fältet AbstractUser.last_login
tillåter nu null-värden. Tidigare var standardvärdet den tidpunkt då användaren skapades, vilket var missvisande om användaren aldrig loggade in. Om du använder standardanvändaren (django.contrib.auth.models.User
) ska du köra databasmigreringen som ingår i contrib.auth
.
Om du använder en anpassad användarmodell som ärver från AbstractUser
måste du köra makemigrations
och generera en migrering för din app som innehåller den modellen. Om du vill ställa in last_login
till NULL
för användare som inte har loggat in kan du också köra den här frågan:
from django.db import models
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractBaseUser
UserModel = get_user_model()
if issubclass(UserModel, AbstractBaseUser):
UserModel._default_manager.filter(last_login=models.F("date_joined")).update(
last_login=None
)
django.contrib.gis
¶
Stöd för GEOS 3.1 och GDAL 1.6 har tagits bort.
Stöd för SpatiaLite < 2.4 har tagits bort.
GIS-specifika uppslagningar har omarbetats för att använda API:et
django.db.models.Lookup
.Standardrepresentationen
str
förGEOSGeometry
-objekt har ändrats från WKT- till EWKT-format (inklusive SRID). Eftersom denna representation används i serialiseringsramverket innebär det attdumpdata
-utdata nu kommer att innehålla SRID-värdet för geometriobjekt.
Prioritering av kontextprocessorer för TemplateResponse
i linje med render
¶
Konstruktören TemplateResponse
är utformad för att vara en direkt ersättning för funktionen render()
. Den hade dock en liten inkompatibilitet, i det att för TemplateResponse
kunde kontextdata från den passerade kontextordboken skuggas av kontextdata som returnerades från kontextprocessorer, medan det för render
var tvärtom. Detta var en bugg, och beteendet för render
är mer lämpligt, eftersom det tillåter att de globalt definierade kontextprocessorerna åsidosätts lokalt i vyn. Om du förlitade dig på att kontextdata i en TemplateResponse
kunde åsidosättas med hjälp av en kontextprocessor, måste du ändra din kod.
Åsidosätta setUpClass
/ tearDownClass
i testfall¶
Dekoratörerna override_settings()
och modify_settings()
agerar nu på klassnivå när de används som klassdekoratörer. Som en konsekvens, när man åsidosätter setUpClass()
eller tearDownClass()
, bör alltid super
implementationen anropas.
Borttagning av django.contrib.formtools
¶
Appen formtools contrib har flyttats till ett separat paket och de relevanta dokumentationssidorna har uppdaterats eller tagits bort.
Det nya paketet finns tillgängligt på GitHub och på PyPI.
Databasanslutning laddas om mellan tester¶
Django stängde tidigare databasanslutningar mellan varje test inom ett TestCase
. Detta är inte längre fallet eftersom Django nu omsluter hela TestCase
inom en transaktion. Om några av dina tester förlitade sig på det gamla beteendet, bör du låta dem ärva från TransactionTestCase
istället.
Uppstädning av namnrymden django.template
¶
Om du har förlitat dig på privata API:er som exponeras i modulen django.template
kan du behöva importera dem från django.template.base
istället.
Även privata API:er django.template.base.compile_string()
, django.template.loader.find_template()
och django.template.loader.get_template_from_string()
togs bort.
model
attribut på privata modellrelationer¶
I tidigare versioner av Django, på en modell med en omvänd foreign key-relation (till exempel), returnerade model._meta.get_all_related_objects()
relationen som en django.db.models.related.RelatedObject
med attributet model
inställt på källan till relationen. Nu returnerar denna metod relationen som django.db.models.fields.related.ManyToOneRel
(privata API RelatedObject
har tagits bort), och attributet model
är inställt på målet för relationen istället för källan. Källmodellen är tillgänglig via attributet related_model
i stället.
Tänk på detta exempel från handledningen i Django 1.8:
>>> p = Poll.objects.get(pk=1)
>>> p._meta.get_all_related_objects()
[<ManyToOneRel: polls.choice>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Poll'>
>>> p._meta.get_all_related_objects()[0].related_model
<class 'polls.models.Choice'>
och jämför det med beteendet på äldre versioner:
>>> p._meta.get_all_related_objects()
[<RelatedObject: polls:choice related to poll>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Choice'>
För att komma åt källmodellen kan du använda ett mönster som detta för att skriva kod som fungerar med både Django 1.8 och äldre versioner:
for relation in opts.get_all_related_objects():
to_model = getattr(relation, "related_model", relation.model)
Observera också att get_all_related_objects()
är föråldrad i 1.8.
Databas backend API¶
Följande ändringar av API:et för databasbackend dokumenteras för att hjälpa dem som skriver backend från tredje part att uppdatera sin kod:
klasserna
BaseDatabaseXXX
har flyttats tilldjango.db.backends.base
. Importera dem från de nya platserna:from django.db.backends.base.base import BaseDatabaseWrapper from django.db.backends.base.client import BaseDatabaseClient from django.db.backends.base.creation import BaseDatabaseCreation from django.db.backends.base.features import BaseDatabaseFeatures from django.db.backends.base.introspection import BaseDatabaseIntrospection from django.db.backends.base.introspection import FieldInfo, TableInfo from django.db.backends.base.operations import BaseDatabaseOperations from django.db.backends.base.schema import BaseDatabaseSchemaEditor from django.db.backends.base.validation import BaseDatabaseValidation
Attributen
data_types
,data_types_suffix
ochdata_type_check_constraints
har flyttats från klassenDatabaseCreation
tillDatabaseWrapper
.Metoden
SQLCompiler.as_sql() `` tar nu en ``subquery
parameter (#24164).Metoden
BaseDatabaseOperations.date_interval_sql()
tar nu bara entimedelta
parameter.
django.contrib.admin
¶
AdminSite
tar inte längre ettapp_name
-argument och dessapp_name
-attribut har tagits bort. Applikationsnamnet är alltidadmin
(i motsats till instansnamnet som du fortfarande kan anpassa med hjälp avAdminSite(name="...")
.Metoden
ModelAdmin.get_object()
(privat API) tar nu ett tredje argument med namnetfrom_field
för att ange vilket fält som ska matcha det angivnaobject_id
.Metoden
ModelAdmin.response_delete()
tar nu ett andra argument med namnetobj_id
som är den serialiserade identifieraren som används för att hämta objektet innan det raderas.
Standard autoescaping av funktioner i django.template.defaultfilters
¶
För att göra inbyggda mallfilter som matar ut HTML ”säkra som standard” när de anropas i Python-kod, har följande funktioner i django.template.defaultfilters
ändrats för att automatiskt undkomma deras ingångsvärde:
”Ansluta
linebreaksbr
linebreaks_filter
linenummer
”oordnad lista
urlize
urlizetrunc
Du kan återgå till det gamla beteendet genom att ange autoescape=False
om du skickar betrott innehåll. Den här ändringen har ingen effekt när du använder motsvarande filter i mallar.
Diverse¶
connections.queries
är nu ett skrivskyddat attribut.Databasanslutningar betraktas som likvärdiga endast om de är samma objekt. De är inte hashbara längre.
GZipMiddleware
används för att inaktivera komprimering för vissa innehållstyper när begäran kommer från Internet Explorer, för att komma runt en bugg i IE6 och tidigare. Detta beteende kunde påverka prestandan i IE7 och senare. Den har tagits bort.URLField.to_python
lägger inte längre till ett efterföljande snedstreck i webbadresser utan sökväg.Mallfiltret
length
returnerar nu0
för en odefinierad variabel, i stället för en tom sträng.ForeignKey.default_error_message['invalid']
har ändrats från'%(model)s instance with pk %(pk)r does not exist.'
till'%(model)s instance with %(field)s %(value)r does not exist.'
Om du använder detta meddelande i din egen kod, uppdatera listan över interpolerade parametrar. Internt kommer Django att fortsätta att tillhandahålla parameternpk
iparams
för bakåtkompatibilitet.UserCreationForm.error_messages['duplicate_username']
används inte längre. Om du vill anpassa felmeddelandet kan du åsidosätta det på formuläret med hjälp av nyckeln'unique'
iMeta.error_messages['username']
eller, om du har ett anpassat formulärfält för'username'
, med hjälp av nyckeln'unique'
i desserror_messages
-argument.Blocket
usertools
i mallenbase.html
idjango.contrib.admin
kräver nu att kontextvariabelnhas_permission
är inställd. Om du har några anpassade adminvyer som använder den här mallen, uppdatera dem för att skickaAdminSite.has_permission()
som den här nya variabelns värde eller helt enkelt inkluderaAdminSite.each_context(request)
i sammanhanget.Interna ändringar gjordes i widgeten
ClearableFileInput
för att möjliggöra mer anpassning. Det odokumenterade attributeturl_markup_template
togs bort till förmån förtemplate_with_initial
.För att vara konsekvent med andra större leverantörer har
en_GB
nu måndag som första dag i veckan.Sekunder har tagits bort från alla lokala som hade dem i
TIME_FORMAT
,DATETIME_FORMAT
ellerSHORT_DATETIME_FORMAT
.Den maximala standardstorleken för Oracle test tablespace har ökat från 300M (eller 200M, före 1.7.2) till 500M.
reverse()
ochreverse_lazy()
returnerar nu Unicode-strängar istället för bytestrings.CacheClass
shim har tagits bort från alla cache backends. Dessa alias tillhandahölls för bakåtkompatibilitet med Django 1.3. Om du fortfarande använder dem, uppdatera ditt projekt så att du använder det riktiga klassnamnet som finns iBACKEND
nyckeln iCACHES
inställning.Som standard hoppar
call_command()
nu alltid över kontrollramverket (om du inte ger detskip_checks=False
).Vid iteration över rader använder
File
nu universal newlines. Följande anses avsluta en rad: Unix-konventionen för radavslut'\n'
, Windows-konventionen'\r\n'
och den gamla Macintosh-konventionen'\r'
.Memcached-cache-backends
MemcachedCache
ochPyLibMCCache
kommer att radera en nyckel omset()
misslyckas. Detta är nödvändigt för att säkerställa att sessionslagretcache_db
alltid hämtar de mest aktuella sessionsdata.Privata API:er
override_template_loaders
ochoverride_with_test_loader
idjango.test.utils
togs bort. ÅsidosättTEMPLATES
medoverride_settings
istället.Varningar från MySQL-databasens backend konverteras inte längre till undantag när
DEBUG
ärTrue
.HttpRequest
har nu en förenkladrepr
(t.ex.<WSGIRequest: GET '/somepath/'>
). Detta kommer inte att förändra beteendet hosSafeExceptionReporterFilter
-klassen.Klassbaserade vyer som använder
ModelFormMixin
kommer att ge upphov till ettImproperlyConfigured
undantag när både attributenfields
ochform_class
är specificerade. Tidigare ignoreradesfields
i tysthet.När testklienten följer omdirigeringar ger den nu upphov till
RedirectCycleError
om den upptäcker en loop eller når en maximal gräns för omdirigering (i stället för att passera tyst).Översättbara strängar som anges som fältets
default
-parameter omvandlas senare till konkreta strängar, så returtypen förField.get_default()
är annorlunda i vissa fall. Det sker ingen ändring av standardvärden som är resultatet av en callable.GenericIPAddressField.empty_strings_allowed
är nuFalse
. Databasbackends som tolkar tomma strängar som null (endast Oracle bland de backends som Django inkluderar) kommer inte längre att konvertera null-värden tillbaka till en tom sträng. Detta är i överensstämmelse med andra backends.När attributet
BaseCommand.leave_locale_alone
ärFalse
avaktiveras nu översättningar istället för att tvinga fram ”en-us” locale. Om dina modeller innehöll icke-engelska strängar och du räknade med att engelska översättningar skulle aktiveras i hanteringskommandon, kommer detta inte att hända längre. Det kan vara så att nya databasmigreringar genereras (en gång) efter migrering till 1.8.django.utils.translation.get_language()
returnerar nuNone
istället förLANGUAGE_CODE
när översättningar är tillfälligt avaktiverade.När det inte finns någon översättning för en viss bokstav hämtas nu reservalternativet från
LANGUAGE_CODE
-språket (i stället för från det oöversattamsgid
-meddelandet).Fältet
name
idjango.contrib.contenttypes.models.ContentType
har tagits bort genom en migrering och ersatts av en egenskap. Det betyder att det inte längre är möjligt att fråga eller filtrera enContentType
med detta fält.Var försiktig om du uppgraderar till Django 1.8 och hoppar över Django 1.7. Om du kör
manage.py migrate --fake
kommer den här migreringen att hoppas över och du kommer att se ettRuntimeError: Error creating new content types.
undantag eftersom kolumnenname
inte kommer att tas bort från databasen. Användmanage.py migrate --fake-initial
för att fejka endast den första migreringen istället.Det nya alternativet
migrate --fake-initial
gör det möjligt att fejka initiala migreringar. I 1.7 fejkades initiala migreringar alltid automatiskt om alla tabeller som skapades i en initial migrering redan existerade.En app utan migreringar med en
ForeignKey
till en app med migreringar kan nu resultera i ett foreign key constraint error när databasen migreras eller tester körs. I Django 1.7 kunde detta misslyckas tyst och resultera i en saknad begränsning. För att lösa felet, lägg till migreringar i appen utan dem.
Funktioner som inte längre är aktuella i 1.8¶
Valda metoder i django.db.models.options.Options
¶
Som en del av formaliseringen av API:et Model._meta
(från klassen django.db.models.options.Options
), har ett antal metoder blivit föråldrade och kommer att tas bort i Django 1.10:
get_all_field_names()
get_all_related_objects()
get_all_related_objects_with_model()
get_all_related_many_to_many_objects()
get_all_related_m2m_objects_with_model()
get_konkreta_fält_med_modell()`
get_field_by_name()
get_fields_with_model()
get_m2m_med_modell()`
django.conf.urls.patterns()
``¶
Förr i tiden med Django uppmuntrades det att referera till vyer som strängar i urlpatterns
:
urlpatterns = patterns(
"",
url("^$", "myapp.views.myview"),
)
och Django skulle magiskt importera myapp.views.myview
internt och förvandla strängen till en riktig funktionsreferens. För att minska upprepning när man refererar till många vyer från samma modul, tar funktionen patterns()
ett obligatoriskt initialt prefix
argument som är prepended till alla views-as-strängar i den uppsättningen av urlpatterns
:
urlpatterns = patterns(
"myapp.views",
url("^$", "myview"),
url("^other/$", "otherview"),
)
I den moderna eran har vi uppdaterat handledningen för att istället rekommendera att du importerar din views-modul och refererar till dina view-funktioner (eller klasser) direkt. Detta har ett antal fördelar, som alla härrör från det faktum att vi använder vanliga Python i stället för ”Django String Magic”: felen när du skriver fel på ett vy-namn är mindre otydliga, IDE kan hjälpa till med autokomplettering av vy-namn, etc.
Så nuförtiden är det mycket mer sannolikt att ovanstående användning av prefix
arg skrivs (och skrivs bättre) som:
from myapp import views
urlpatterns = patterns(
"",
url("^$", views.myview),
url("^other/$", views.otherview),
)
Därför har patterns()
inget större syfte och är en börda när man lär upp nya användare (genom att svara på nybörjarens fråga ”varför behöver jag den här tomma strängen som första argument till patterns()
?”). Av dessa anledningar avregistrerar vi den. Att uppdatera din kod är så enkelt som att se till att urlpatterns
är en lista över django.conf.urls.url()
instanser. Till exempel:
from django.conf.urls import url
from myapp import views
urlpatterns = [
url("^$", views.myview),
url("^other/$", views.otherview),
]
Skicka en sträng som view
till django.conf.urls.url()
¶
Relaterat till föregående punkt, att referera till vyer som strängar i funktionen url()
är föråldrat. Skicka istället den anropsbara vyn enligt beskrivningen i föregående avsnitt.
django.core.context_processors
¶
Inbyggda mallkontextprocessorer har flyttats till django.template.context_processors
.
django.test.SimpleTestCase.urls
¶
Attributet SimpleTestCase.urls
för att ange URLconf-konfiguration i tester har föråldrats och kommer att tas bort i Django 1.10. Använd @override_settings(ROOT_URLCONF=...)
istället.
prefix
argument till i18n_patterns()
¶
Relaterat till föregående punkt, argumentet prefix
till django.conf.urls.i18n.i18n_patterns()
har utgått. Skicka helt enkelt en lista med django.conf.urls.url()
-instanser istället.
Använda ett felaktigt antal uppackade värden i for
-malltaggen¶
Att använda ett felaktigt antal uppackade värden i for
tag kommer att ge upphov till ett undantag istället för att misslyckas tyst i Django 1.10.
Skicka en prickad sökväg till reverse()
och url
¶
Att vända webbadresser efter Python-sökväg är en dyr operation eftersom det leder till att sökvägen som vänds importeras. Detta beteende har också resulterat i en säkerhetsfråga. Använd :ref:``namngivna URL-mönster <naming-url-patterns>` för att vända istället.
Om du använder django.contrib.sitemaps
, lägg till argumentet name
i url
som refererar till django.contrib.sitemaps.views.sitemap()
:
from django.contrib.sitemaps.views import sitemap
url(
r"^sitemap\.xml$",
sitemap,
{"sitemaps": sitemaps},
name="django.contrib.sitemaps.views.sitemap",
)
för att säkerställa kompatibilitet vid reversering av Python-sökväg tas bort i Django 1.10.
På samma sätt för GIS-webbplatskartor, lägg till name='django.contrib.gis.sitemaps.views.kml'
eller name='django.contrib.gis.sitemaps.views.kmz'
.
Om du använder en Python-sökväg för inställningen LOGIN_URL
eller LOGIN_REDIRECT_URL
ska du använda namnet på url()
istället.
Aggregerade metoder och moduler¶
Modulerna django.db.models.sql.aggregates
och django.contrib.gis.db.models.sql.aggregates
(båda privata API), har utgått eftersom django.db.models.aggregates
och django.contrib.gis.db.models.aggregates
nu också ansvarar för SQL-generering. De gamla modulerna kommer att tas bort i Django 1.10.
Om du använde de gamla modulerna, se Query Expressions för instruktioner om hur du skriver om anpassade aggregat med hjälp av det nya stabila API:et.
Följande metoder och egenskaper för django.db.models.sql.query.Query
har också utgått och bakåtkompatibiliteten kommer att tas bort i Django 1.10:
Query.aggregates
, ersatt avannotations
.Query.aggregate_select
, ersatt avannotation_select
.Query.add_aggregate()
, ersatt avadd_annotation()
.Query.set_aggregate_mask()
, ersatt avset_annotation_mask()
.Query.append_aggregate_mask()
, ersatt avappend_annotation_mask()
.
Utökade argument för hanteringskommandon genom Command.option_list
¶
Management-kommandon använder nu argparse
istället för optparse
för att analysera kommandoradsargument som skickas till kommandon. Detta innebär också att sättet att lägga till anpassade argument till kommandon har ändrats: istället för att utöka klasslistan option_list
bör du nu åsidosätta metoden add_arguments()
och lägga till argument genom argparse.add_argument()
. Se det här exemplet för mer information.
django.core.management.NoArgsCommand
¶
Klassen NoArgsCommand
är nu föråldrad och kommer att tas bort i Django 1.10. Använd BaseCommand
istället, som inte tar några argument som standard.
Lista alla migreringar i ett projekt¶
Alternativet --list
i hanteringskommandot migrate
är föråldrat och kommer att tas bort i Django 1.10. Använd showmigrations
istället.
alternativet cache_choices
för ModelChoiceField
och ModelMultipleChoiceField
¶
ModelChoiceField
och ModelMultipleChoiceField
tog ett odokumenterat, otestat alternativ cache_choices
. Detta cachade querysets mellan flera renderingar av samma Form
-objekt. Detta alternativ är föremål för en accelererad utfasning och kommer att tas bort i Django 1.9.
django.template.resolve_variable()`
¶
Funktionen har varit informellt markerad som ”Deprecated” under en tid. Ersätt resolve_variable(path, context)
med django.template.Variable(path).resolve(context)
.
django.contrib.webdesign
¶
Den tillhandahöll lorem
malltagg som nu ingår i de inbyggda taggarna. Ta helt enkelt bort 'django.contrib.webdesign'
från INSTALLED_APPS
och {% load webdesign %}
från dina mallar.
error_message
argument till django.forms.RegexField
¶
Det gav bakåtkompatibilitet för kod från före 1.0, men dess funktionalitet är överflödig. Använd Field.error_messages['invalid']
istället.
Gammal syntax för :tfilter:`unordered_list¶
Ett äldre (pre-1.0), mer restriktivt och mångordigt indataformat för mallfiltret unordered_list
har tagits bort:
["States", [["Kansas", [["Lawrence", []], ["Topeka", []]]], ["Illinois", []]]]
Med hjälp av den nya syntaxen blir detta:
["States", ["Kansas", ["Lawrence", "Topeka"], "Illinois"]]
django.forms.Field._has_changed()
¶
Byt namn på denna metod till has_changed()
genom att ta bort det inledande understrecket. Det gamla namnet kommer fortfarande att fungera fram till Django 1.10.
is_admin_site
argument till django.contrib.auth.views.password_reset()
¶
Det är ett gammalt alternativ som inte längre borde vara nödvändigt.
UnderfältBas
¶
django.db.models.fields.subclassing.SubfieldBase
har blivit föråldrad och kommer att tas bort i Django 1.10. Historiskt sett användes det för att hantera fält där typkonvertering behövdes vid laddning från databasen, men det användes inte i .values()
-anrop eller i aggregat. Det har ersatts med from_db_value()
.
Det nya tillvägagångssättet anropar inte to_python()
-metoden vid tilldelning som var fallet med SubfieldBase
. Om du behöver det beteendet, återimplementera klassen Creator
från Djangos källkod <https://github.com/django/django/blob/stable/1.8.x/django/db/models/fields/subclassing.py#L31-L44>` i ditt projekt.
django.utils.checksums
¶
Modulen django.utils.checksums
har blivit föråldrad och kommer att tas bort i Django 1.10. Funktionaliteten som den tillhandahöll (validering av kontrollsumma med Luhn-algoritmen) var odokumenterad och användes inte i Django. Modulen har flyttats till paketet django-localflavor (version 1.1+).
InlineAdminForm.original_content_type_id
¶
Attributet original_content_type_id
på InlineAdminForm
har blivit föråldrat och kommer att tas bort i Django 1.10. Historiskt sett användes det för att konstruera URL:en ”view on site”. Denna URL är nu tillgänglig med hjälp av attributet absolute_url
i formuläret.
django.views.generic.edit.FormMixin.get_form()
’s form_class
argument¶
FormMixin
subklasser som åsidosätter get_form()
metoden bör se till att tillhandahålla ett standardvärde för form_class
argumentet eftersom det nu är valfritt.
Rendering av mallar som laddats av get_template()
med en Context
¶
Returtypen för get_template()
har ändrats i Django 1.8: istället för en django.template.Template
returnerar den en Template
-instans vars exakta typ beror på vilken backend som laddade den.
Båda klasserna tillhandahåller en render()
-metod, men den förra tar en django.template.Context
som argument medan den senare förväntar sig en dict
. Denna ändring verkställs genom en deprecation path för Django-mallar.
Allt detta gäller även för select_template()
.
Template
och Context
klasser i mallsvar¶
Vissa metoder i SimpleTemplateResponse
och TemplateResponse
accepterade django.template.Context
och django.template.Template
objekt som argument. De bör nu ta emot dict
respektive backend-beroende mallobjekt.
Detta gäller även för returtyperna om du har underklassat någon av mallsvarsklasserna.
Kontrollera template response API-dokumentation för detaljer.
argumenten dictionary
och context_instance
i renderingsfunktioner¶
Följande funktioner kommer inte längre att acceptera parametrarna dictionary
och context_instance
i Django 1.10:
django.shortcuts.render()
django.shortcuts.render_to_response()
django.template.loader.render_to_string()
Använd parametern context
istället. När dictionary
skickas som ett positionellt argument, vilket är det vanligaste idiomet, behövs inga ändringar.
Om du skickar en Context
i context_instance
, skicka en dict
i context
parametern istället. Om du skickar en RequestContext
, skicka begäran separat i parametern request
.
dirs
-argument för funktioner för att hitta mallar¶
Följande funktioner kommer inte längre att acceptera en dirs
parameter för att åsidosätta TEMPLATE_DIRS
i Django 1.10:
django.shortcuts.render_to_response()
Parametern fungerade inte konsekvent mellan olika mallinläsare och fungerade inte för inkluderade mallar.
django.template.loader.BaseLoader
¶
django.template.loader.BaseLoader
döptes om till django.template.loaders.base.Loader
. Om du har skrivit en anpassad mallladdare som ärver BaseLoader
måste du ärva Loader
istället.
django.test.utils.TestTemplateLoader
¶
Privata API django.test.utils.TestTemplateLoader
är föråldrat till förmån för django.template.loaders.locmem.Loader
och kommer att tas bort i Django 1.9.
Stöd för argumentet max_length
i anpassade Storage
-klasser¶
Storage
subklasser bör lägga till max_length=None
som en parameter till get_available_name()
och/eller save()
om de åsidosätter någon av metoderna. Stöd för lagringsenheter som inte accepterar detta argument kommer att tas bort i Django 1.10.
qn
ersatt av compiler
¶
I tidigare Django-versioner accepterade olika interna ORM-metoder (mestadels as_sql
-metoder) ett qn
-argument (för ”citatnamn”), vilket var en referens till en funktion som citerade identifierare för att skicka till databasen. I Django 1.8 har det argumentet bytt namn till compiler
och är nu en fullständig SQLCompiler
-instans. För bakåtkompatibilitet utför anrop av en SQLCompiler
-instans samma namnkvot som qn
-funktionen brukade göra. Denna bakåtkompatibilitets-shim är dock omedelbart föråldrad: du bör byta namn på dina qn
-argument till compiler
och anropa ``compiler.quote_name_unless_alias(…) `` där du tidigare kallade ``qn(…) ``.
Standardvärde för RedirectView.permanent
¶
Standardvärdet för attributet RedirectView.permanent
kommer att ändras från True
till False
i Django 1.9.
Använda AuthenticationMiddleware
utan SessionAuthenticationMiddleware
¶
django.contrib.auth.middleware.SessionAuthenticationMiddleware
lades till i Django 1.7. I Django 1.7.2 flyttades dess funktionalitet till auth.get_user()
och, för bakåtkompatibilitet, aktiveras den endast om 'django.contrib.auth.middleware.SessionAuthenticationMiddleware'
finns i MIDDLEWARE_CLASSES
.
I Django 1.10 kommer sessionsverifiering att aktiveras oavsett om SessionAuthenticationMiddleware
är aktiverat eller inte (vid vilken tidpunkt SessionAuthenticationMiddleware
inte kommer att ha någon betydelse). Du kan lägga till det i din MIDDLEWARE_CLASSES
någon gång innan dess för att välja in. Läs :ref:``uppgraderingsöverväganden <session-invalidation-on-password-change>` först.
django.contrib.sitemaps.FlatPageSitemap
¶
django.contrib.sitemaps.FlatPageSitemap
har flyttats till django.contrib.flatpages.sitemaps.FlatPageSitemap
. Den gamla importplatsen är föråldrad och kommer att tas bort i Django 1.9.
ssi
mall tagg¶
Malltaggen ssi
gör att filer kan inkluderas i en mall med absolut sökväg. Detta är av begränsad användning i de flesta distributionssituationer, och include
-taggen är ofta mer meningsfull. Denna tagg är nu föråldrad och kommer att tas bort i Django 1.10.
=
som jämförelseoperator i if
malltagg¶
Att använda ett enda likhetstecken med malltaggen {% if %}
för jämlikhetstestning var odokumenterat och otestat. Det är nu föråldrat till förmån för ==
.
%(<foo>)s`
syntax i ModelFormMixin.success_url
¶
Den äldre syntaxen %(<foo>)s
i ModelFormMixin.success_url
är föråldrad och kommer att tas bort i Django 1.10.
aggregerade metoder för GeoQuerySet
¶
Aggregatmetoderna collect()
, extent()
, extent3d()
, make_line()
och unionagg()
är föråldrade och bör ersättas av sina funktionsbaserade aggregatmotsvarigheter (Collect
, Extent
, Extent3D
, MakeLine
och Union
).
Signatur för routermetoden ”allow_migrate¶
Signaturen för metoden allow_migrate()
för databasroutrar har ändrats från allow_migrate(db, model)
till allow_migrate(db, app_label, model_name=None, **hints)
.
När model_name
är inställt kan det värde som tidigare gavs genom det positionella argumentet model
nu hittas i ordlistan hints
under nyckeln 'model'
.
Efter att ha bytt till den nya signaturen kommer routern också att anropas av operationerna RunPython
och RunSQL
.
Funktioner borttagna i 1.8¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 1.8. Se Funktioner som inte längre är aktuella i 1.6 för detaljer, inklusive hur man tar bort användningen av dessa funktioner.
django.contrib.comments
är borttagen.Följande API:er för transaktionshantering har tagits bort:
TransactionMiddleware
dekoratorerna och kontexthanterarna
autocommit
,commit_on_success
ochcommit_manually
, definierade idjango.db.transaction
funktionerna
commit_unless_managed
ochrollback_unless_managed
, som också definieras idjango.db.transaction
inställningen
TRANSACTIONS_MANAGED
Malltaggarna
cycle
ochfirstof
skriver ut sina argument automatiskt.Inställningen
SEND_BROKEN_LINK_EMAILS
har tagits bort.django.middleware.doc.XViewMiddleware
tas bort.Aliaset
Model._meta.module_name
har tagits bort.De bakåtkompatibla shims som infördes för att byta namn på
get_query_set
och liknande queryset-metoder tas bort. Detta påverkar följande klasser:BaseModelAdmin
,ChangeList
,BaseCommentNode
,GenericForeignKey
,Manager
,SingleRelatedObjectDescriptor
ochReverseSingleRelatedObjectDescriptor
.De bakåtkompatibla shims som infördes för att byta namn på attributen
ChangeList.root_query_set
ochChangeList.query_set
tas bort.django.views.defaults.shortcut
ochdjango.conf.urls.shortcut
tas bort.Stöd för modulen Python Imaging Library (PIL) har tagits bort.
Följande privata API:er har tagits bort:
django.db.backend
django.db.close_connection()
django.db.backends.creation.BaseDatabaseCreation.set_autocommit()`
django.db.transaction.is_managed()
``django.db.transaction.managed()
django.forms.widgets.RadioInput
tas bort.Modulen
django.test.simple
och klassendjango.test.simple.DjangoTestSuiteRunner
tas bort.Modulen
django.test._doctest
har tagits bort.Inställningen
CACHE_MIDDLEWARE_ANONYMOUS_ONLY
tas bort. Denna ändring påverkar bådedjango.middleware.cache.CacheMiddleware
ochdjango.middleware.cache.UpdateCacheMiddleware
trots avsaknaden av en varning för avskrivning i den senare klassen.Användning av den hårdkodade Håll ner ”Control”, eller ”Command” på en Mac, för att välja mer än en. sträng för att åsidosätta eller lägga till användartillhandahållen
help_text
i formulär förManyToMany
modellfält utförs inte av Django längre varken på modell- eller formulärskiktet.Metoderna
Model._meta.get_(add|change|delete)_permission
har tagits bort.Sessionsnyckeln
django_language
läses inte längre av bakåtkompatibilitetsskäl.Geografiska webbplatskartor har tagits bort (
django.contrib.gis.sitemaps.views.index
ochdjango.contrib.gis.sitemaps.views.sitemap
).django.utils.html.fix_ampersands
, mallfiltretfix_ampersands
ochdjango.utils.html.clean_html
tas bort.