Django 1.10 versionsinformation¶
1 augusti 2016
Välkommen till Django 1.10!
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.9 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 några funktioner.
Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.
Kompatibilitet med Python¶
Liksom Django 1.9 kräver Django 1.10 Python 2.7, 3.4 eller 3.5. Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.
Vad är nytt i Django 1.10¶
Fulltextsökning efter PostgreSQL¶
django.contrib.postgres innehåller nu en samling av databasfunktioner för att möjliggöra användning av fulltextsökmotorn. Du kan söka över flera fält i din relationsdatabas, kombinera sökningarna med andra uppslagningar, använda olika språkkonfigurationer och viktningar samt rangordna resultaten efter relevans.
Det innehåller nu också stöd för trigram, med hjälp av trigram_similar lookup och uttrycken TrigramSimilarity och TrigramDistance.
Ny typ av middleware¶
En ny typ av mellanprogram introduceras för att lösa bristen på strikt request/response-skiktning i den gamla typen av mellanprogram som beskrivs i DEP 0005. Du måste anpassa gamla, anpassade mellanprogram och byta från inställningen MIDDLEWARE_CLASSES till den nya MIDDLEWARE-inställningen för att dra nytta av förbättringarna.
Officiellt stöd för Unicode-användarnamn¶
Modellen User i django.contrib.auth accepterade ursprungligen endast ASCII-bokstäver och siffror i användarnamn. Även om det inte var ett medvetet val har Unicode-tecken alltid accepterats när Python 3 används.
Användarnamnsvalidatorn accepterar nu uttryckligen Unicode-tecken som standard endast i Python 3.
Anpassade användarmodeller kan använda den nya ASCIIUsernameValidator eller UnicodeUsernameValidator.
Mindre funktioner¶
django.contrib.admin¶
För webbplatser som körs på en underväg kommer standard
URL för länken "Visa webbplats"högst upp på varje administratörssida nu att peka pårequest.META['SCRIPT_NAME']om den är inställd, istället för/.Det framgångsmeddelande som visas när du har lagt till eller redigerat ett objekt innehåller nu en länk till objektets ändringsformulär.
All inline JavaScript tas bort så att du kan aktivera HTTP-huvudet ”Content-Security-Policy” om du vill.
Det nya attributet
InlineModelAdmin.classesgör det möjligt att ange klasser på inline-fältuppsättningar. Inlines med encollapse-klass kommer initialt att vara kollapsade och deras rubrik kommer att ha en liten ”show”-länk.Om en användare inte har behörighet att lägga till kommer blocket
object-toolspå en modells ändringslista nu att återges (utan knappen för att lägga till). Detta gör det enklare att lägga till anpassade verktyg i det här fallet.Modellen
LogEntrylagrar nu ändringsmeddelanden i en JSON-struktur så att meddelandet kan översättas dynamiskt med hjälp av det aktuella aktiva språket. En ny metodLogEntry.get_change_message()är nu det föredragna sättet att hämta ändringsmeddelandet.Valda objekt för fält i
ModelAdmin.raw_id_fieldshar nu en länk till objektets ändringsformulär.Lagt till alternativen ”No date” och ”Has date” för
DateFieldListFilterom fältet är nullable.JQuery-biblioteket som är inbäddat i administratören har uppgraderats från version 2.1.4 till 2.2.3.
django.contrib.auth¶
Lagt till stöd för Argon2 lösenordshash. Det rekommenderas framför PBKDF2, men det är inte standard eftersom det kräver ett tredjepartsbibliotek.
Standardantalet iterationer för PBKDF2-lösenordshasher har ökats med 25%. Denna bakåtkompatibla ändring kommer inte att påverka användare som har underklassat
django.contrib.auth.hashers.PBKDF2PasswordHasherför att ändra standardvärdet.Vyn
django.contrib.auth.views.logout()skickar ”no-cache”-rubriker för att förhindra ett problem där Safari cachar omdirigeringar och hindrar en användare från att kunna logga ut.Lade till det valfria
backend-argumentet tilldjango.contrib.auth.login()för att tillåta användning utan inloggningsuppgifter.Den nya
LOGOUT_REDIRECT_URL-inställningen styr omdirigeringen av vyndjango.contrib.auth.views.logout(), om vyn inte får ettnext_page-argument.Den nya parametern
redirect_authenticated_userför vyndjango.contrib.auth.views.login()gör det möjligt att omdirigera autentiserade användare som besöker inloggningssidan.De nya
AllowAllUsersModelBackendochAllowAllUsersRemoteUserBackendignorerar värdet avUser.is_active, medanModelBackendochRemoteUserBackendnu avvisar inaktiva användare.
django.contrib.gis¶
Distance lookups accepterar nu uttryck som parametern för avståndsvärdet.
Den nya egenskapen
GEOSGeometry.unary_unionberäknar föreningen av alla element i denna geometri.Lade till
GEOSGeometry.covers()binärt predikat.Lade till metoden
GDALBand.statistics()och attributenmeanochstd.Lagt till stöd för
MakeLine-aggregatet ochGeoHash-funktionen på SpatiaLite.Lagt till stöd för funktionerna
Difference,IntersectionochSymDifferencepå MySQL.Stöd för instansiering av tomma GEOS-geometrier har lagts till.
De nya egenskaperna
trimochprecisioniWKTWritergör det möjligt att styra utmatningen av bråkdelen av koordinaterna i WKT.Lagt till egenskaperna
LineString.closedochMultiLineString.closed.Serien GeoJSON serializer matar nu ut primärnyckeln för objekt i ordlistan
propertiesom specifika fält inte anges.Möjligheten att replikera indata på metoden
GDALBand.data()lades till. Banddata kan nu uppdateras med upprepade värden på ett effektivt sätt.Lagt till databasfunktionerna
IsValidochMakeValid, samtisvalidlookup, alla för PostGIS. Detta gör det möjligt att filtrera och reparera ogiltiga geometrier på databassidan.Lagt till rasterstöd för alla spatiala uppslagningar.
django.contrib.postgres¶
För enkelhetens skull kastar
HStoreFieldnu sina nycklar och värden till strängar.
django.contrib.sessions¶
Hanteringskommandot
clearsessionstar nu bort filbaserade sessioner.
django.contrib.sites¶
Modellen
Sitehar nu stöd för naturliga nycklar.
django.contrib.staticfiles¶
Malltaggen
staticanvänder nudjango.contrib.staticfilesom den finns iINSTALLED_APPS. Detta är särskilt användbart för tredjepartsappar som nu alltid kan använda{% load static %}(istället för{% load staticfiles %}eller{% load static from staticfiles %}) och inte oroa sig för om appenstaticfilesär installerad eller inte.Du kan enklare anpassa alternativet
collectstatic --ignoremed en anpassadAppConfig.
Cache¶
Den filbaserade cache-backend använder nu det högsta picklingprotokollet.
CSRF¶
Standardinställningen :CSRF_FAILURE_VIEW,
views.csrf.csrf_failure()accepterar nu en valfri parametertemplate_name, med standardvärdet'403_csrf.html', för att styra den mall som används för att rendera sidan.För att skydda mot BREACH-attacker ändrar CSRF-skyddsmekanismen nu värdet på formulärets token vid varje förfrågan (samtidigt som den behåller en oföränderlig hemlighet som kan användas för att validera de olika tokens).
Databas backends¶
Subtraktion av temporär data var enhetlig på alla backends.
Om databasen stöder det kan backends ställa in
DatabaseFeatures.can_return_ids_from_bulk_insert=Trueoch implementeraDatabaseOperations.fetch_returned_insert_ids()för att ställa in primärnycklar på objekt som skapats medQuerySet.bulk_create().Lade till nyckelordsargument till
as_sql()-metoderna för olika uttryck (Func,When,CaseochOrderBy) för att tillåta databasbackends att anpassa dem utan att muteraself, vilket inte är säkert när man använder olika databasbackends. Se parametrarnaarg_joineroch**extra_contextiFunc.as_sql()för ett exempel.
Fil delning¶
Lagringsbackends presenterar nu ett tidszonsmedvetet API med nya metoder
get_accessed_time(),get_created_time()ochget_modified_time(). De returnerar en tidszonsmedvetendatatidomUSE_TZärTrueoch en naivdatatidi den lokala tidszonen annars.Den nya
Storage.generate_filename()-metoden gör det enklare att implementera anpassade lagringsenheter som inte använderos.path-anropen som tidigare fanns iFileField.
Formulär¶
Formuläret och widgeten
Mediaanvänds nu meddjango.contrib.staticfilesom det är installerat.Taggen
<input>som återges avCharFieldinnehåller nu ett attributminlengthom fältet har enmin_length.Obligatoriska formulärfält har nu HTML-attributet
required. Ställ in det nya attributetForm.use_required_attributetillFalseför att inaktivera det. Attributetrequiredingår inte i formulär för formuläruppsättningar eftersom webbläsarens validering kanske inte är korrekt när du lägger till och tar bort formuläruppsättningar.
Generiska åsikter¶
Klassen
Viewkan nu importeras fråndjango.views.
Internationalisering¶
Hjälpfunktionen
i18n_patterns()kan nu användas i en rot-URLConf som anges medrequest.urlconf.Genom att ställa in den nya parametern
prefix_default_languageföri18n_patterns()tillFalsekan du tillåta åtkomst till standardspråket utan ett URL-prefix.set_language()returnerar nu en 204 statuskod (Inget innehåll) för AJAX-förfrågningar när det inte finns någonnextparameter iPOSTellerGET.De klassbaserade vyerna
JavaScriptCatalogochJSONCatalogersätter de föråldrade funktionsbaserade vyernajavascript_catalog()ochjson_catalog(). De nya vyerna är nästan likvärdiga med de gamla förutom att de nya vyerna som standard samlar in alla JavaScript-strängar i översättningsdomänendjangojsfrån alla installerade appar istället för bara JavaScript-strängarna frånLOCALE_PATHS.
Kommandon för hantering¶
call_command()returnerar nu det värde som returneras från metodencommand.handle().Det nya alternativet
check --fail-levelgör det möjligt att ange den meddelandenivå som gör att kommandot avslutas med en status som inte är noll.Det nya alternativet
makemigrations --checkgör att kommandot avslutas med en status som inte är noll när modelländringar utan migreringar upptäcks.makemigrationsvisar nu sökvägen till de migreringsfiler som den genererar.Alternativet
shell --interfaceaccepterar nupythonför att tvinga fram användning av den ”vanliga” Python-tolken.Med det nya alternativet
shell --commandkan du köra ett kommando som Django och avsluta, istället för att öppna det interaktiva skalet.Lade till en varning till
dumpdataom en proxymodell anges (vilket resulterar i ingen utdata) utan dess konkreta förälder.Det nya attributet
BaseCommand.requires_migrations_checkskan ställas in påTrueom du vill att ditt kommando ska skriva ut en varning, somrunservergör, om uppsättningen av migreringar på disken inte matchar migreringarna i databasen.För att underlätta testning accepterar
call_command()nu ett kommando-objekt som det första argumentet.Kommandot
shellstöder tabbkomplettering på system som använderlibedit, t.ex. macOS.Med kommandot
inspectdbkan du välja vilka tabeller som ska inspekteras genom att ange deras namn som argument.
Migreringar¶
Lagt till stöd för serialisering av
enum.Enum-objekt.Lade till argumentet
elidabletill operationernaRunSQLochRunPythonför att tillåta att de tas bort när migreringar krossas.Lagt till stöd för non-atomic migrations genom att ställa in attributet
atomicpå enMigration.Kommandona
migrateochmakemigrationshar nu check for a consistent migration history. Om de hittar några otillämpade beroenden av en tillämpad migrering, uppstårInconsistentMigrationHistory.Signalerna
pre_migrate()ochpost_migrate()skickar nu sina migreringarplanochapps.
Modeller¶
Omvända utländska nycklar från proxymodeller sprids nu till deras konkreta klass. Den omvända relationen som bifogas av en
ForeignKeysom pekar på en proxymodell är nu tillgänglig som en deskriptor på proxymodellklassen och kan refereras till i queryset-filtrering.Den nya
Field.rel_db_type()-metoden returnerar databaskolumnens datatyp för fält somForeignKeyochOneToOneFieldsom pekar på ett annat fält.Klassattributet
arityläggs till iFunc. Detta attribut kan användas för att ställa in antalet argument som funktionen accepterar.Lade till
BigAutoFieldsom fungerar ungefär som enAutoFieldförutom att den garanterat passar siffror från1till9223372036854775807.QuerySet.in_bulk()kan anropas utan några argument för att returnera alla objekt i queryset.related_query_namestöder nu appetikett och klassinterpolering med hjälp av strängarna'%(app_label)s'och'%(class)s'.Tillåter åsidosättande av modellfält som ärvts från abstrakta basklasser.
Funktionen
prefetch_related_objects()är nu ett offentligt API.QuerySet.bulk_create() <django.db.models.query.QuerySet.bulk_create>`()ställer in primärnyckeln på objekt när PostgreSQL används.Lagt till databasfunktionen
Cast.En proxymodell kan nu ärva flera proxymodeller som delar en gemensam icke-abstrakt föräldraklass.
Lagt till
Extract-funktioner för att extrahera datetime-komponenter som heltal, t.ex. år och timme.Lagt till
Trunc-funktioner för att trunkera ett datum eller en datatid till en betydande komponent. De möjliggör frågor som försäljning per dag eller försäljning per timme.Model.__init__()anger nu värden för virtuella fält från dess nyckelordsargument.De nya alternativen
Meta.base_manager_nameochMeta.default_manager_namegör det möjligt att styra_base_managerrespektive_default_manager.
Förfrågningar och svar¶
Lade till
request.useri felsökningsvyn.Added
HttpResponsemethodsreadable()andseekable()to make an instance a stream-like object and allow wrapping it withio.TextIOWrapper.Lagt till attributen
HttpRequest.content_typeochcontent_paramssom tolkas från rubrikenCONTENT_TYPE.Parsern för
request.COOKIEShar förenklats för att bättre matcha webbläsarnas beteende.request.COOKIESkan nu innehålla cookies som är ogiltiga enligt :rfc:`6265`` men som är möjliga att ställa in viadocument.cookie.
Serialisering¶
django.core.serializers.json.DjangoJSONEncodervet nu hur man serialiserar lata strängar, som vanligtvis används för översättningsbart innehåll.
Mallar¶
Lade till alternativet
autoescapetillDjangoTemplates-backend ochEngine-klassen.Lade till jämförelseoperatorerna
isochis nottill taggenif.Tillåter
dictsortatt ordna en lista med listor efter ett element vid ett angivet index.Kontextprocessorn
debug()innehåller frågor för alla databasalias i stället för bara standardaliaset.Lagt till stöd för relativa sökvägar för strängargument i malltaggarna
extendsochinclude.
Tester¶
För att bättre fånga upp buggar kontrollerar
TestCasenu deferrable databasbegränsningar i slutet av varje test.Tester och testfall kan märkas med taggar och köras selektivt med de nya alternativen
test --tagochtest --exclude-tag.Du kan nu logga in och använda sessioner med testklienten även om
django.contrib.sessionsinte finns iINSTALLED_APPS.
URL:er¶
An addition in
django.setup()allows URL resolving that happens outside of the request/response cycle (e.g. in management commands and standalone scripts) to takeFORCE_SCRIPT_NAMEinto account when it is set.
Validerare¶
URLValidatorbegränsar nu längden på domännamnsetiketter till 63 tecken och den totala längden på domännamn till 253 tecken enligt RFC 1034.int_list_validator()accepterar nu en valfri boolesk parameterallow_negative, med standardvärdetFalse, för att tillåta negativa heltal.
Bakåtkompatibla ändringar i 1.10¶
Varning
Utöver de ändringar som beskrivs i det här avsnittet bör du granska Funktioner borttagna i 1.10 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¶
GIS:s
AreaFieldanvänder en ospecificerad underliggande numerisk typ som i praktiken kan vara vilken numerisk Python-typ som helst.decimal.Decimal-värden som hämtas från databasen konverteras nu tillfloatför att göra det lättare att kombinera dem med värden som används av GIS-biblioteken.För att aktivera temporal subtraktion måste du ställa in databasfunktionsflaggan
supports_temporal_subtractiontillTrueoch implementera metodenDatabaseOperations.subtract_temporals(). Denna metod ska returnera den SQL och de parametrar som krävs för att beräkna skillnaden i mikrosekunder mellan argumentenlhsochrhsi den datatyp som används för att lagraDurationField.
_meta.get_fields() returnerar konsekventa omvända fält för proxymodeller¶
Före Django 1.10 returnerade metoden get_fields() olika omvända fält när den anropades på en proxymodell jämfört med dess proxybetonade klass. Denna inkonsekvens åtgärdades genom att returnera den fullständiga uppsättningen fält som pekar på en konkret klass eller en av dess proxyer i båda fallen.
AbstractUser.username max_length ökad till 150¶
En migrering för django.contrib.auth.models.User.username ingår. Om du har en anpassad användarmodell som ärver från AbstractUser måste du generera och tillämpa en databasmigrering för din användarmodell.
We considered an increase to 254 characters to more easily allow the use of
email addresses (which are limited to 254 characters) as usernames but rejected
it due to a MySQL limitation. When using the utf8mb4 encoding (recommended
for proper Unicode support), MySQL can only create unique indexes with 191
characters by default. Therefore, if you need a longer length, please use a
custom user model.
Om du vill behålla gränsen på 30 tecken för användarnamn ska du använda ett anpassat formulär när du skapar en användare eller ändrar användarnamn:
from django.contrib.auth.forms import UserCreationForm
class MyUserCreationForm(UserCreationForm):
username = forms.CharField(
max_length=30,
help_text="Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.",
)
Om du vill behålla denna begränsning i administratören, ställ in UserAdmin.add_form för att använda detta formulär:
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
class UserAdmin(BaseUserAdmin):
add_form = MyUserCreationForm
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
Slopat stöd för PostgreSQL 9.1¶
Uppströmsstöd för PostgreSQL 9.1 slutar i september 2016. Som en följd av detta ställer Django 1.10 PostgreSQL 9.2 som den minsta version som den officiellt stöder.
runserver utdata går genom loggning¶
Hantering av begäran och svar för kommandot runserver skickas till loggern django-server-logger` istället för till sys.stderr. Om du inaktiverar Djangos loggningskonfiguration eller åsidosätter den med din egen, måste du lägga till lämplig loggningskonfiguration om du vill se den utdata:
LOGGING = {
# ...
"formatters": {
"django.server": {
"()": "django.utils.log.ServerFormatter",
"format": "[%(server_time)s] %(message)s",
}
},
"handlers": {
"django.server": {
"level": "INFO",
"class": "logging.StreamHandler",
"formatter": "django.server",
},
},
"loggers": {
"django.server": {
"handlers": ["django.server"],
"level": "INFO",
"propagate": False,
}
},
}
testmodellerna auth.CustomUser och auth.ExtensionUser har tagits bort¶
Sedan införandet av migreringar för Contrib-apparna i Django 1.8 skapades inte tabellerna för dessa anpassade användartestmodeller längre, vilket gör dem oanvändbara i ett testsammanhang.
Apps-registret fylls inte längre i automatiskt när man plockar upp modeller utanför Django¶
Appregistret fylls inte längre i automatiskt när man plockar bort modeller. Detta lades till i Django 1.7.2 som ett försök att tillåta uppplockning av modeller utanför Django, till exempel i en RQ-arbetare, utan att anropa django.setup(), men det skapar en möjlighet till ett dödläge. För att anpassa din kod i fallet med RQ kan du ”tillhandahålla ditt eget arbetsskript <https://python-rq.org/docs/workers/>`_ som anropar django.setup().
Borttagen kontroll av null-tilldelning för icke-null-fält i främmande nycklar¶
I äldre versioner gav tilldelning av None till en icke-nullbar ForeignKey eller OneToOneField upphov till ValueError('Cannot assign None: "model.field" does not allow null values.'). För att vara konsekvent med andra modellfält som inte har en liknande kontroll tas denna kontroll bort.
Svaga lösenordshashers har tagits bort från standardinställningen PASSWORD_HASHERS¶
Django 0.90 lagrade lösenord som osaltad MD5. Django 0.91 lade till stöd för saltad SHA1 med automatisk uppgradering av lösenord när en användare loggar in. Django 1.4 lade till PBKDF2 som standardlösenordshasher.
Om du har ett gammalt Django-projekt med MD5- eller SHA1-kodade (även saltade) lösenord, var medveten om att dessa kan knäckas ganska enkelt med dagens hårdvara. För att få Django-användare att erkänna fortsatt användning av svaga hashrar, tas följande hashrar bort från standardinställningen PASSWORD_HASHERS:
"django.contrib.auth.hashers.SHA1PasswordHasher""django.contrib.auth.hashers.MD5PasswordHasher""django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher""django.contrib.auth.hashers.UnsaltedMD5PasswordHasher""django.contrib.auth.hashers.CryptPasswordHasher"
Överväg att använda en wrapped password hasher för att stärka hasharna i din databas. Om det inte är möjligt, lägg till inställningen PASSWORD_HASHERS i ditt projekt och lägg till de hashare som du behöver.
Du kan kontrollera om din databas innehåller någon av de borttagna hasharna så här:
from django.contrib.auth import get_user_model
User = get_user_model()
# Unsalted MD5/SHA1:
User.objects.filter(password__startswith="md5$$")
User.objects.filter(password__startswith="sha1$$")
# Salted MD5/SHA1:
User.objects.filter(password__startswith="md5$").exclude(password__startswith="md5$$")
User.objects.filter(password__startswith="sha1$").exclude(password__startswith="sha1$$")
# Crypt hasher:
User.objects.filter(password__startswith="crypt$$")
from django.db.models import CharField
from django.db.models.functions import Length
CharField.register_lookup(Length)
# Unsalted MD5 passwords might not have an 'md5$$' prefix:
User.objects.filter(password__length=32)
metoderna Field.get_prep_lookup() och Field.get_db_prep_lookup() har tagits bort¶
Om du har ett anpassat fält som implementerar någon av dessa metoder registrerar du en anpassad lookup för det. Till exempel:
from django.db.models import Field
from django.db.models.lookups import Exact
class MyField(Field): ...
class MyFieldExact(Exact):
def get_prep_lookup(self):
# do_custom_stuff_for_myfield
...
MyField.register_lookup(MyFieldExact)
django.contrib.gis¶
Stöd för SpatiaLite < 3.0 och GEOS < 3.3 har tagits bort.
Det bakåtkompatibla aliaset
add_postgis_srs()fördjango.contrib.gis.utils.add_srs_entry()har tagits bort.I Oracle/GIS returnerar aggregatfunktionen
Areanu enfloatistället fördecimal.Decimal. (Det är fortfarande förpackat i ett mått på kvadratmeter.)Standard
GEOSGeometryrepresentation (WKT-utdata) är trimmad som standard. Det vill säga, istället förPOINT (23.0000000000000000 5.5000000000000000), får duPOINT (23 5.5).
Maximal storlek på en request body och antalet GET/POST-parametrar är begränsade¶
Två nya inställningar hjälper till att mildra överbelastningsattacker via stora förfrågningar:
DATA_UPLOAD_MAX_MEMORY_SIZEbegränsar hur stor en begäran får vara. Filuppladdningar räknas inte in i denna gräns.DATA_UPLOAD_MAX_NUMBER_FIELDSbegränsar antalet GET/POST-parametrar som analyseras.
Program som tar emot ovanligt stora formulärposter kan behöva justera dessa inställningar.
Diverse¶
repr()av enQuerySetär omsluten av<QuerySet >för att skilja den från en vanlig lista vid felsökning.utils.version.get_version()returnerar PEP 440-kompatibla releasekandidatversioner (t.ex. ’1.10rc1’ istället för ’1.10c1’).CSRF-tokenvärden måste nu vara strängar med 64 alfanumeriska tecken; värden med 32 alfanumeriska tecken, som ställs in av äldre versioner av Django som standard, ersätts automatiskt av strängar med 64 tecken. Andra värden betraktas som ogiltiga. Detta bör endast påverka utvecklare eller användare som ersätter dessa tokens.
Inställningen
LOGOUT_URLtas bort eftersom Django inte har använt den sedan pre-1.0. Om du använder det i ditt projekt kan du lägga till det i projektets inställningar. Standardvärdet var'/accounts/logout/'.Objekt med en
close()-metod, t.ex. filer och generatorer som skickas tillHttpResponse, stängs nu omedelbart istället för när WSGI-servern anroparclose()på svaret.Ett överflödigt anrop till
transaction.atomic()iQuerySet.update_or_create()har tagits bort. Detta kan påverka antalet frågor som testas avTransactionTestCase.assertNumQueries().Stöd för
skip_validationiBaseCommand.execute(**options)har tagits bort. Användskip_checks(tillagd i Django 1.7) istället.loaddatager nu upphov till ettCommandErroristället för att visa en varning när den angivna fixture-filen inte hittas.Istället för att direkt komma åt attributet
LogEntry.change_messageär det nu bättre att anropa metodenLogEntry.get_change_message()som kommer att ge meddelandet på det aktuella språket.Standardfelvyerna ger nu upphov till
TemplateDoesNotExistom ett icke-existerandetemplate_nameanges.Det oanvända nyckelordsargumentet
choicesiSelectochSelectMultiplewidgetsrender()metod har tagits bort. Argumentetchoicesi metodenrender_options()tas också bort, vilket görselected_choicestill det första argumentet.Tester som bryter mot deferrable databasbegränsningar kommer nu att misslyckas när de körs på en databas som stöder deferrable begränsningar.
Inbyggda hanteringskommandon använder nu indexering av nycklar i
options, t.ex.options['verbosity'], istället föroptions.get()och utför inte längre någon typ tvång. Detta kan vara ett problem om du anropar kommandon med hjälp avCommand.execute()(som kringgår argumentparsern som anger ett standardvärde) istället förcall_command(). Istället för att anropaCommand.execute(), skicka kommando-objektet som det första argumentet tillcall_command().ModelBackendochRemoteUserBackendavvisar nu inaktiva användare. Detta innebär att inaktiva användare inte kan logga in och kommer att loggas ut om de byts frånis_active=TruetillFalse. Om du behöver det tidigare beteendet, använd den nyaAllowAllUsersModelBackendellerAllowAllUsersRemoteUserBackendiAUTHENTICATION_BACKENDSistället.In light of the previous change, the test client’s
login()method no longer always rejects inactive users but instead delegates this decision to the authentication backend.force_login()also delegates the decision to the authentication backend, so if you’re using the default backends, you need to use an active user.django.views.i18n.set_language()kan nu returnera en 204-statuskod för AJAX-förfrågningar.The
base_fieldattribute ofRangeFieldis now a type of field, not an instance of a field. If you have created a custom subclass ofRangeField, you should change thebase_fieldattribute.Middleware-klasser initieras nu när servern startar i stället för vid den första förfrågan.
Om du åsidosätter
is_authenticated()elleris_anonymous()i en anpassad användarmodell måste du konvertera dem till attribut eller egenskaper enligt beskrivningen i the deprecation note.När du använder
ModelAdmin.save_as=True, omdirigeras knappen ”Spara som ny” nu till ändringsvyn för det nya objektet istället för till modellens ändringslista. Om du behöver det tidigare beteendet, ställ in det nya attributetModelAdmin.save_as_continuetillFalse.Obligatoriska formulärfält har nu HTML-attributet
required. Ställ inForm.use_required_attributeattributet tillFalseför att inaktivera det. Du kan också lägga till attributetnovalidatetill<form>om du inte vill ha webbläsarvalidering. För att inaktivera attributetrequiredpå anpassade widgets, åsidosättWidget.use_required_attribute()-metoden.WSGI-hanteraren tar inte längre bort innehållet i svar från
HEAD-förfrågningar eller svar med enstatus_codepå 100-199, 204 eller 304. De flesta webbservrar implementerar redan detta beteende. Svar som hämtas med hjälp av Django-testklienten fortsätter att ha dessa ”svarskorrigeringar” tillämpade.Model.__init__()tar nu emotdjango.db.models.DEFERREDsom värde för uppskjutna fält.Attributet
Model._deferredtas bort för dynamiska modellklasser när man använderQuerySet.defer()ochonly()tas bort.Storage.save() <django.core.files.storage.Storage.save>`()ersätter inte längre'\'med'/'. Detta beteende flyttas tillFileSystemStorageeftersom detta är en lagringsspecifik implementationsdetalj. Alla Windows-användare med en anpassad lagringsimplementering som förlitar sig på detta beteende måste implementera det i den anpassade lagringenssave()-metod.Privata
FileField-metodernaget_directory_name()ochget_filename()anropas inte längre (och är nu föråldrade) vilket är en bakåtkompatibel ändring för användare som åsidosätter dessa metoder på anpassade fält. För att anpassa sådan kod, åsidosättFileField.generate_filename()ellerStorage.generate_filename()istället. Det kan vara möjligt att användaupload_toockså.Ämnet i mail som skickas av
AdminEmailHandlertrunkeras inte längre till 989 tecken. Om du räknade med en begränsad längd kan du trunkera ämnet själv.Privata uttryck
django.db.models.expressions.DateochDateTimetas bort. De nyaTruncuttrycken ger samma funktionalitet.Attributen
_base_manageroch_default_managertas bort från modellinstanser. De förblir tillgängliga för modellklassen.Om du öppnar ett borttaget fält i en modellinstans, t.ex. efter
del obj.field, laddas fältets värde om istället för att skapaAttributeError.Om du underklassar
AbstractBaseUseroch åsidosätterclean(), se till att den anroparsuper().AbstractBaseUser.normalize_username()anropas i en nyAbstractBaseUser.clean()metod.Privat API
django.forms.models.model_to_dict()returnerar en queryset istället för en lista med primärnycklar förManyToManyField.Om
django.contrib.staticfilesär installerat, använderstaticmall-taggenstaticfiles-lagringen för att konstruera URL:en istället för att bara sammanfoga värdet medSTATIC_ROOT. Det nya tillvägagångssättet kodar URL:en, vilket kan vara bakåtkompatibelt i fall som att inkludera ett fragment i en sökväg, t.ex.{% static 'img.svg#fragment' %}, eftersom#kodas som%23. För att anpassa dig, flytta fragmentet utanför malltaggen:{% static 'img.svg' %}#fragment.När
USE_L10NärTruetillämpas nu lokalisering för filtrendateochtimenär ingen formatsträng anges. AngivelsernaDATE_FORMATochTIME_FORMATfrån den aktiva språkdräkten används istället för inställningarna med samma namn.
Funktioner som inte längre är aktuella i 1.10¶
Direkt tilldelning till en omvänd främmande nyckel eller många-till-många-relation¶
Istället för att tilldela relaterade objekt med hjälp av direkt tilldelning:
>>> new_list = [obj1, obj2, obj3]
>>> e.related_set = new_list
Använd metoden set() som lagts till i Django 1.9:
>>> e.related_set.set([obj1, obj2, obj3])
Detta förhindrar förvirring om att en tilldelning resulterar i en implicit sparning.
Inte tidszonmedveten Storage API¶
De gamla metoderna accessed_time(), created_time() och modified_time(), som inte är tidszonmedvetna, har utgått till förmån för de nya metoderna get_*_time().
Tredjeparts lagringsbackends bör implementera de nya metoderna och markera de gamla som föråldrade. Fram till dess konverterar de nya get_*_time()-metoderna på basen Storage-klassen datetime från de gamla metoderna efter behov och avger en varning för föråldring när de gör det.
Tredjeparts lagringsbackends kan behålla de gamla metoderna så länge de vill stödja tidigare versioner av Django.
django.contrib.gis¶
Metoderna
get_srid()ochset_srid()iGEOSGeometryär avförda till förmån för egenskapensrid.Metoderna
get_x(),set_x(),get_y(),set_y(),get_z()ochset_z()iPointär avförda till förmån för egenskapernax,yochz.Metoderna
get_coords()ochset_coords()förPointär avförda till förmån för egenskapentuple.Egenskapen
cascaded_unioniMultiPolygonär avskriven till förmån för egenskapenunary_union.Funktionen
django.contrib.gis.utils.precision_wkt()är föråldrad till förmån förWKTWriter.
KommaSepareradIntegerField modellfält¶
CommaSeparatedIntegerField är föråldrad till förmån för CharField med validate_comma_separated_integer_list() validator:
from django.core.validators import validate_comma_separated_integer_list
from django.db import models
class MyModel(models.Model):
numbers = models.CharField(..., validators=[validate_comma_separated_integer_list])
Om du använder Oracle använder CharField en annan typ av databasfält (NVARCHAR2) än CommaSeparatedIntegerField (VARCHAR2). Beroende på dina databasinställningar kan detta innebära en annan kodning och därmed en annan längd (i byte) för samma innehåll. Om dina lagrade värden är längre än gränsen på 4000 byte för NVARCHAR2 bör du använda TextField (NCLOB) istället. Om du i det här fallet har frågor som grupperar efter fältet (t.ex. genom att kommentera modellen med en aggregering eller använda distinct()) måste du ändra dem (så att fältet skjuts upp).
__search fråga uppslagning¶
Lookupen search, som endast stöder MySQL och har extremt begränsade funktioner, är utdaterad. Ersätt den med en anpassad uppslagning:
from django.db import models
class Search(models.Lookup):
lookup_name = "search"
def as_mysql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return "MATCH (%s) AGAINST (%s IN BOOLEAN MODE)" % (lhs, rhs), params
models.CharField.register_lookup(Search)
models.TextField.register_lookup(Search)
Använda User.is_authenticated() och User.is_anonymous() som metoder¶
Metoderna is_authenticated() och is_anonymous() i klasserna AbstractBaseUser och AnonymousUser är nu egenskaper. De kommer fortfarande att fungera som metoder fram till Django 2.0, men all användning i Django använder nu attributåtkomst.
Om du till exempel använder AuthenticationMiddleware och vill veta om användaren för närvarande är inloggad skulle du använda:
if request.user.is_authenticated:
... # Do something for logged-in users.
else:
... # Do something for anonymous users.
istället för request.user.is_authenticated().
Denna ändring undviker oavsiktligt informationsläckage om du glömmer att anropa metoden, t.ex.:
if request.user.is_authenticated:
return sensitive_information
Om du åsidosätter dessa metoder i en anpassad användarmodell måste du ändra dem till egenskaper eller attribut.
Django använder ett CallableBool-objekt för att låta dessa attribut fungera som både en egenskap och en metod. Således kan du inte jämföra dessa egenskaper med hjälp av operatören is förrän deprecation-perioden slutar. Det vill säga att följande inte fungerar:
if request.user.is_authenticated is True:
...
”escape”-delen av django.utils.safestring¶
Funktionen mark_for_escaping() och de klasser den använder: EscapeData, EscapeBytes, EscapeText, EscapeString och EscapeUnicode är föråldrade.
Som ett resultat är det ”lata” beteendet hos escape-filtret (där det alltid skulle tillämpas som det sista filtret oavsett var i filterkedjan det dök upp) föråldrat. Filtret kommer att ändras till att omedelbart tillämpa conditional_escape() i Django 2.0.
Diverse¶
Alternativet
makemigrations --exitär utdaterat till förmån för alternativetmakemigrations --check.django.utils.functional.allow_lazy()är utfasad till förmån för den nyakeep_lazy()-funktionen som kan användas med en mer naturlig dekoratorsyntax.Alternativet
shell --plainär föråldrat till förmån för-i pythoneller--interface python.Import från modulen
django.core.urlresolversär utfasad till förmån för dess nya plats,django.urls.Mallmetoden
Context.has_key()är utfasad till förmån förin.Det privata attributet
virtual_fieldsiModel._metaär utfasat till förmån förprivate_fields.De privata nyckelordsargumenten
virtual_onlyiField.contribute_to_class()ochvirtualiModel._meta.add_field()är föråldrade till förmån förprivate_onlyrespektiveprivate.Vyerna
javascript_catalog()ochjson_catalog()är utfasade till förmån för de klassbaserade vyernaJavaScriptCatalogochJSONCatalog.I arv med flera tabeller är implicit marknadsföring av ett
OneToOneFieldtill enparent_linkföråldrad. Lägg tillparent_link=Truetill sådana fält.Det privata API:et
Widget._format_value()görs offentligt och byter namn tillformat_value(). Det gamla namnet kommer att fungera genom en avskrivningsperiod.De privata metoderna
FileFieldget_directory_name()ochget_filename()är avförda till förmån för att utföra detta arbete iStorage.generate_filename()).Gammaldags middleware som använder
settings.MIDDLEWARE_CLASSESär föråldrad. Anpassa gammal, anpassad middleware och använd den nya inställningenMIDDLEWARE.
Funktioner borttagna i 1.10¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 1.10. Se Funktioner som inte längre är aktuella i 1.8 för detaljer, inklusive hur man tar bort användningen av dessa funktioner.
Stöd för att anropa en
SQLCompilerdirekt som ett alias för att anropa dessquote_name_unless_alias-metod tas bort.Malltaggarna
cycleochfirstoftas bort från malltaggbiblioteketfuture.django.conf.urls.patterns()har tagits bort.Stöd för argumentet
prefixtilldjango.conf.urls.i18n.i18n_patterns()har tagits bort.SimpleTestCase.urlstas bort.Om man använder ett felaktigt antal uppackade värden i
for-malltaggen uppstår ett undantag i stället för att misslyckas tyst.Möjligheten att
reverse()URL:er som använder en prickad Python-sökväg har tagits bort.Möjligheten att använda en prickad Python-sökväg för inställningarna
LOGIN_URLochLOGIN_REDIRECT_URLhar tagits bort.Stöd för
optparsetas bort för anpassade hanteringskommandon.Klassen
django.core.management.NoArgsCommandhar tagits bort.modulen
django.core.context_processorshar tagits bort.modulen
django.db.models.sql.aggregateshar tagits bort.modulen
django.contrib.gis.db.models.sql.aggregateshar tagits bort.Följande metoder och egenskaper för
django.db.sql.query.Querytas bort:Egenskaper:
aggregatochaggregat_selectMetoder:
add_aggregate,set_aggregate_maskochappend_aggregate_mask.
django.template.resolve_variabletas bort.Följande privata API:er har tagits bort från
django.db.models.options.Options(Model._meta):get_field_by_name()get_all_field_names()get_fields_with_model()get_concrete_fields_with_model()get_m2m_with_model()get_all_related_objects()get_all_related_objects_with_model()get_all_related_many_to_many_objects()get_all_related_m2m_objects_with_model()
Argumentet
error_messageidjango.forms.RegexFieldhar tagits bort.Filtret
unordered_liststöder inte längre listor i gammal stil.Stöd för sträng-”view”-argument till
url()har tagits bort.Den bakåtkompatibla shim för att byta namn på
django.forms.Form._has_changed()tillhas_changed()tas bort.Mallfiltret
removetagstas bort.Funktionerna
remove_tags()ochstrip_entities()idjango.utils.htmltas bort.Argumentet
is_admin_sitetilldjango.contrib.auth.views.password_reset()har tagits bort.django.db.models.field.subclassing.SubfieldBasetas bort.django.utils.checksumsär borttagen.Attributet
original_content_type_idpådjango.contrib.admin.helpers.InlineAdminFormär borttaget.Den bakåtkompatibla shim som tillåter att
FormMixin.get_form()definieras utan något standardvärde för dessform_class-argument har tagits bort.Följande inställningar tas bort och du måste uppgradera till inställningen
TEMPLATES:TILLÅTET_INKLUDERA_RÖTTERTEMPLATE_KONTEXT_PROCESSORERTEMPLATE_DEBUGTEMPLATE_DIRSTEMPLATE_LADDARETEMPLATE_STRING_IF_INVALID
Det bakåtkompatibla aliaset
django.template.loader.BaseLoadertas bort.Django template objects returned by
get_template()andselect_template()no longer accept aContextin theirrender()method.Template response APIs genomdriva användningen av
dictoch backend-beroende mallobjekt istället förContextrespektiveTemplate.Parametern
current_appför följande funktioner och klasser har tagits bort:django.shortcuts.render()django.template.Context()django.template.RequestContext()django.template.response.TemplateResponse()``
Parametrarna
dictionaryochcontext_instanceför följande funktioner har tagits bort:django.shortcuts.render()django.shortcuts.render_to_response()django.template.loader.render_to_string()
Parametern
dirsför följande funktioner har tagits bort:django.template.loader.get_template()django.template.loader.select_template()django.shortcuts.render()django.shortcuts.render_to_response()
Sessionsverifiering är aktiverad oavsett om
'django.contrib.auth.middleware.SessionAuthenticationMiddleware'finns iMIDDLEWARE_CLASSESeller inte.SessionAuthenticationMiddlewarehar inte längre något syfte och kan tas bort frånMIDDLEWARE_CLASSES. Det behålls som en stubbe fram till Django 2.0 som en artighet för användare som inte läser den här noten.Det privata attributet
django.db.models.Field.relatedhar tagits bort.Alternativet
--listi hanteringskommandotmigratehar tagits bort.Malltaggen
ssihar tagits bort.Stöd för jämförelseoperatorn
=i malltaggenifhar tagits bort.De shims för bakåtkompatibilitet som tillåter att
Storage.get_available_name()ochStorage.save()definieras utan ettmax_length-argument har tagits bort.Stöd för den äldre syntaxen
%(<foo>)siModelFormMixin.success_urlhar tagits bort.aggregatmetoderna
GeoQuerySetcollect(),extent(),extent3d(),make_line()ochunionagg()har tagits bort.Möjligheten att ange
ContentType.namenär man skapar en innehållstypsinstans har tagits bort.Stöd för den gamla signaturen
allow_migratehar tagits bort.Stöd för syntaxen för
{% cycle %}som använder kommaseparerade argument har tagits bort.Varningen som
Signerutfärdade när den fick en ogiltig separator är nu ettValueError.