Django 1.10 release notes

1 augusti 2016

Välkommen till Django 1.10!

Dessa release notes 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 :doc:``samling av databasfunktioner </ref/contrib/postgres/search>` 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 &lt;https://github.com/django/deps/blob/main/final/0005-improved-middleware.rst&gt;`_. 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.classes gör det möjligt att ange klasser på inline-fältuppsättningar. Inlines med en collapse-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-tools på 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 LogEntry lagrar nu ändringsmeddelanden i en JSON-struktur så att meddelandet kan översättas dynamiskt med hjälp av det aktuella aktiva språket. En ny metod LogEntry.get_change_message() är nu det föredragna sättet att hämta ändringsmeddelandet.

  • Valda objekt för fält i ModelAdmin.raw_id_fields har nu en länk till objektets ändringsformulär.

  • Lagt till alternativen ”No date” och ”Has date” för DateFieldListFilter om 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.PBKDF2PasswordHasher fö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 till django.contrib.auth.login() för att tillåta användning utan inloggningsuppgifter.

  • Den nya LOGOUT_REDIRECT_URL-inställningen styr omdirigeringen av vyn django.contrib.auth.views.logout(), om vyn inte får ett next_page-argument.

  • Den nya parametern redirect_authenticated_user för vyn django.contrib.auth.views.login() gör det möjligt att omdirigera autentiserade användare som besöker inloggningssidan.

  • De nya AllowAllUsersModelBackend och AllowAllUsersRemoteUserBackend ignorerar värdet av User.is_active, medan ModelBackend och RemoteUserBackend nu avvisar inaktiva användare.

django.contrib.gis

django.contrib.postgres

  • För enkelhetens skull kastar HStoreField nu sina nycklar och värden till strängar.

django.contrib.sessions

  • Hanteringskommandot clearsessions tar nu bort filbaserade sessioner.

django.contrib.sites

  • Modellen Site har nu stöd för :ref:``naturliga nycklar <topics-serialization-natural-keys>`.

django.contrib.staticfiles

  • Malltaggen static använder nu django.contrib.staticfiles om den finns i INSTALLED_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 appen staticfiles är installerad eller inte.

  • Du kan :ref:enklare anpassa <customize-staticfiles-ignore-patterns> alternativet collectstatic --ignore med en anpassad AppConfig.

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 parameter template_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=True och implementera DatabaseOperations.fetch_returned_insert_ids() för att ställa in primärnycklar på objekt som skapats med QuerySet.bulk_create().

  • Lade till nyckelordsargument till as_sql()-metoderna för olika uttryck (Func, When, Case och OrderBy) för att tillåta databasbackends att anpassa dem utan att mutera self, vilket inte är säkert när man använder olika databasbackends. Se parametrarna arg_joiner och **extra_context i Func.as_sql() för ett exempel.

Fil delning

Formulär

  • Formuläret och widgeten Media används nu med django.contrib.staticfiles om det är installerat.

  • Taggen <input> som återges av CharField innehåller nu ett attribut minlength om fältet har en min_length.

  • Obligatoriska formulärfält har nu HTML-attributet required. Ställ in det nya attributet Form.use_required_attribute till False för att inaktivera det. Attributet required ingå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 View kan nu importeras från django.views.

Internationalisering

  • Hjälpfunktionen i18n_patterns() kan nu användas i en rot-URLConf som anges med request.urlconf.

  • Genom att ställa in den nya parametern prefix_default_language för i18n_patterns() till False kan 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ågon next parameter i POST eller GET.

  • De klassbaserade vyerna JavaScriptCatalog och JSONCatalog ersätter de föråldrade funktionsbaserade vyerna javascript_catalog() och json_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änen djangojs från alla installerade appar istället för bara JavaScript-strängarna från LOCALE_PATHS.

Kommandon för hantering

  • call_command() returnerar nu det värde som returneras från metoden command.handle().

  • Det nya alternativet check --fail-level gö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 --check gör att kommandot avslutas med en status som inte är noll när modelländringar utan migreringar upptäcks.

  • makemigrations visar nu sökvägen till de migreringsfiler som den genererar.

  • Alternativet shell --interface accepterar nu python för att tvinga fram användning av den ”vanliga” Python-tolken.

  • Med det nya alternativet shell --command kan du köra ett kommando som Django och avsluta, istället för att öppna det interaktiva skalet.

  • Lade till en varning till dumpdata om en proxymodell anges (vilket resulterar i ingen utdata) utan dess konkreta förälder.

  • Det nya attributet BaseCommand.requires_migrations_checks kan ställas in på True om du vill att ditt kommando ska skriva ut en varning, som runserver gö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 shell stöder tabbkomplettering på system som använder libedit, t.ex. macOS.

  • Med kommandot inspectdb kan 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 elidable till operationerna RunSQL och RunPython för att tillåta att de tas bort när migreringar krossas.

  • Lagt till stöd för :ref:non-atomic migrations <non-atomic-migrations> genom att ställa in attributet atomic på en Migration.

  • Kommandona migrate och makemigrations har nu check for a consistent migration history. Om de hittar några otillämpade beroenden av en tillämpad migrering, uppstår InconsistentMigrationHistory.

  • Signalerna pre_migrate() och post_migrate() skickar nu sina migreringar plan och apps.

Modeller

  • Omvända utländska nycklar från proxymodeller sprids nu till deras konkreta klass. Den omvända relationen som bifogas av en ForeignKey som 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 som ForeignKey och OneToOneField som pekar på ett annat fält.

  • Klassattributet arity läggs till i Func. Detta attribut kan användas för att ställa in antalet argument som funktionen accepterar.

  • Lade till BigAutoField som fungerar ungefär som en AutoField förutom att den garanterat passar siffror från 1 till 9223372036854775807.

  • QuerySet.in_bulk() kan anropas utan några argument för att returnera alla objekt i queryset.

  • related_query_name stö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_name och Meta.default_manager_name gör det möjligt att styra _base_manager respektive _default_manager.

Förfrågningar och svar

  • Lade till request.user i felsökningsvyn.

  • Lagt till HttpResponse-metoderna readable() och seekable() för att göra en instans till ett strömliknande objekt och tillåta inpackning med io.TextIOWrapper.

  • Lagt till attributen HttpRequest.content_type och content_params som tolkas från rubriken CONTENT_TYPE.

  • Parsern för request.COOKIES har förenklats för att bättre matcha webbläsarnas beteende. request.COOKIES kan nu innehålla cookies som är ogiltiga enligt :rfc:`6265`` men som är möjliga att ställa in via document.cookie.

Serialisering

  • django.core.serializers.json.DjangoJSONEncoder vet nu hur man serialiserar lata strängar, som vanligtvis används för översättningsbart innehåll.

Mallar

  • Lade till alternativet autoescape till DjangoTemplates-backend och Engine-klassen.

  • Lade till jämförelseoperatorerna is och is not till taggen if.

  • Tillåter dictsort att 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 extends och include.

Tester

URL:er

  • Ett tillägg i django.setup() gör att URL-resolving som sker utanför request/response-cykeln (t.ex. i hanteringskommandon och fristående skript) kan ta hänsyn till FORCE_SCRIPT_NAME när den ställs in.

Validerare

  • URLValidator begrä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 parameter allow_negative, med standardvärdet False, 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 AreaField anvä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 till float fö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_subtraction till True och implementera metoden DatabaseOperations.subtract_temporals(). Denna metod ska returnera den SQL och de parametrar som krävs för att beräkna skillnaden i mikrosekunder mellan argumenten lhs och rhs i den datatyp som används för att lagra DurationField.

_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.

Vi övervägde en ökning till 254 tecken för att lättare tillåta användning av e-postadresser (som är begränsade till 254 tecken) som användarnamn men avvisade det på grund av en MySQL-begränsning. När du använder kodningen utf8mb4 (rekommenderas för korrekt Unicode-stöd) kan MySQL endast skapa unika index med 191 tecken som standard. Om du behöver en längre längd ska du därför använda en anpassad användarmodell.

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ör django.contrib.gis.utils.add_srs_entry() har tagits bort.

  • I Oracle/GIS returnerar aggregatfunktionen Area nu en float istället för decimal.Decimal. (Det är fortfarande förpackat i ett mått på kvadratmeter.)

  • Standard GEOSGeometry representation (WKT-utdata) är trimmad som standard. Det vill säga, istället för POINT (23.0000000000000000 5.5000000000000000), får du POINT (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:

Program som tar emot ovanligt stora formulärposter kan behöva justera dessa inställningar.

Diverse

  • repr() av en QuerySet ä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_URL tas 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 till HttpResponse, stängs nu omedelbart istället för när WSGI-servern anropar close() på svaret.

  • Ett överflödigt anrop till transaction.atomic() i QuerySet.update_or_create() har tagits bort. Detta kan påverka antalet frågor som testas av TransactionTestCase.assertNumQueries().

  • Stöd för skip_validation i BaseCommand.execute(**options) har tagits bort. Använd skip_checks (tillagd i Django 1.7) istället.

  • loaddata ger nu upphov till ett CommandError istä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 metoden LogEntry.get_change_message() som kommer att ge meddelandet på det aktuella språket.

  • Standardfelvyerna ger nu upphov till TemplateDoesNotExist om ett icke-existerande template_name anges.

  • Det oanvända nyckelordsargumentet choices i Select och SelectMultiple widgets render() metod har tagits bort. Argumentet choices i metoden render_options() tas också bort, vilket gör selected_choices till 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ör options.get() och utför inte längre någon typ tvång. Detta kan vara ett problem om du anropar kommandon med hjälp av Command.execute() (som kringgår argumentparsern som anger ett standardvärde) istället för call_command(). Istället för att anropa Command.execute(), skicka kommando-objektet som det första argumentet till call_command().

  • ModelBackend och RemoteUserBackend avvisar nu inaktiva användare. Detta innebär att inaktiva användare inte kan logga in och kommer att loggas ut om de byts från is_active=True till False. Om du behöver det tidigare beteendet, använd den nya AllowAllUsersModelBackend eller AllowAllUsersRemoteUserBackend i AUTHENTICATION_BACKENDS istället.

  • Mot bakgrund av den tidigare ändringen avvisar testklientens login()-metod inte längre alltid inaktiva användare utan delegerar istället detta beslut till autentiseringsbackend. force_login() delegerar också beslutet till autentiseringsbackend, så om du använder standardbackend måste du använda en aktiv användare.

  • django.views.i18n.set_language() kan nu returnera en 204-statuskod för AJAX-förfrågningar.

  • Attributet base_field i RangeField är nu en typ av fält, inte en instans av ett fält. Om du har skapat en anpassad underklass av RangeField, bör du ändra attributet base_field.

  • 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() eller is_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 attributet ModelAdmin.save_as_continue till False.

  • Obligatoriska formulärfält har nu HTML-attributet required. Ställ in Form.use_required_attribute attributet till False för att inaktivera det. Du kan också lägga till attributet novalidate till <form> om du inte vill ha webbläsarvalidering. För att inaktivera attributet required på anpassade widgets, åsidosätt Widget.use_required_attribute()-metoden.

  • WSGI-hanteraren tar inte längre bort innehållet i svar från HEAD-förfrågningar eller svar med en status_code på 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 emot django.db.models.DEFERRED som värde för uppskjutna fält.

  • Attributet Model._deferred tas bort för dynamiska modellklasser när man använder QuerySet.defer() och only() tas bort.

  • Storage.save() <django.core.files.storage.Storage.save>`() ersätter inte längre '\' med '/'. Detta beteende flyttas till FileSystemStorage eftersom 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 lagringens save()-metod.

  • Privata FileField-metoderna get_directory_name() och get_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ätt FileField.generate_filename() eller Storage.generate_filename() istället. Det kan vara möjligt att använda upload_to också.

  • Ämnet i mail som skickas av AdminEmailHandler trunkeras 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.Date och DateTime tas bort. De nya Trunc uttrycken ger samma funktionalitet.

  • Attributen _base_manager och _default_manager tas 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 skapa AttributeError.

  • Om du underklassar AbstractBaseUser och åsidosätter clean(), se till att den anropar super(). AbstractBaseUser.normalize_username() anropas i en ny AbstractBaseUser.clean() metod.

  • Privat API django.forms.models.model_to_dict() returnerar en queryset istället för en lista med primärnycklar för ManyToManyField.

  • Om django.contrib.staticfiles är installerat, använder static mall-taggen staticfiles-lagringen för att konstruera URL:en istället för att bara sammanfoga värdet med STATIC_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 är True tillämpas nu lokalisering för filtren date och time när ingen formatsträng anges. Angivelserna DATE_FORMAT och TIME_FORMAT frå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 :klass:`~django.core.files.storage.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() och set_srid() i GEOSGeometry är avförda till förmån för egenskapen srid.

  • Metoderna get_x(), set_x(), get_y(), set_y(), get_z() och set_z() i Point är avförda till förmån för egenskaperna x, y och z.

  • Metoderna get_coords() och set_coords() för Point är avförda till förmån för egenskapen tuple.

  • Egenskapen cascaded_union i MultiPolygon är avskriven till förmån för egenskapen unary_union.

  • Funktionen django.contrib.gis.utils.precision_wkt() är föråldrad till förmån för WKTWriter.

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 alternativet makemigrations --check.

  • django.utils.functional.allow_lazy() är utfasad till förmån för den nya keep_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 python eller --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ör in.

  • Det privata attributet virtual_fields i Model._meta är utfasat till förmån för private_fields.

  • De privata nyckelordsargumenten virtual_only i Field.contribute_to_class() och virtual i Model._meta.add_field() är föråldrade till förmån för private_only respektive private.

  • Vyerna javascript_catalog() och json_catalog() är utfasade till förmån för de klassbaserade vyerna JavaScriptCatalog och JSONCatalog.

  • I arv med flera tabeller är implicit marknadsföring av ett OneToOneField till en parent_link föråldrad. Lägg till parent_link=True till sådana fält.

  • Det privata API:et Widget._format_value() görs offentligt och byter namn till format_value(). Det gamla namnet kommer att fungera genom en avskrivningsperiod.

  • De privata metoderna FileField get_directory_name() och get_filename() är avförda till förmån för att utföra detta arbete i Storage.generate_filename()).

  • Gammaldags middleware som använder settings.MIDDLEWARE_CLASSES är föråldrad. Anpassa gammal, anpassad middleware och använd den nya inställningen MIDDLEWARE.

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 SQLCompiler direkt som ett alias för att anropa dess quote_name_unless_alias -metod tas bort.

  • Malltaggarna cycle och firstof tas bort från malltaggbiblioteket future.

  • django.conf.urls.patterns() har tagits bort.

  • Stöd för argumentet prefix till django.conf.urls.i18n.i18n_patterns() har tagits bort.

  • SimpleTestCase.urls tas 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_URL och LOGIN_REDIRECT_URL har tagits bort.

  • Stöd för optparse tas bort för anpassade hanteringskommandon.

  • Klassen django.core.management.NoArgsCommand har tagits bort.

  • modulen django.core.context_processors har tagits bort.

  • modulen django.db.models.sql.aggregates har tagits bort.

  • modulen django.contrib.gis.db.models.sql.aggregates har tagits bort.

  • Följande metoder och egenskaper för django.db.sql.query.Query tas bort:

    • Egenskaper: aggregat och aggregat_select

    • Metoder: add_aggregate, set_aggregate_mask och append_aggregate_mask.

  • django.template.resolve_variable tas 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_konkreta_fält_med_modell()`

    • get_m2m_med_modell()`

    • 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_message i django.forms.RegexField har tagits bort.

  • Filtret unordered_list stö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() till has_changed() tas bort.

  • Mallfiltret removetags tas bort.

  • Funktionerna remove_tags() och strip_entities() i django.utils.html tas bort.

  • Argumentet is_admin_site till django.contrib.auth.views.password_reset() har tagits bort.

  • django.db.models.field.subclassing.SubfieldBase tas bort.

  • django.utils.checksums är borttagen.

  • Attributet original_content_type_iddjango.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 dess form_class-argument har tagits bort.

  • Följande inställningar tas bort och du måste uppgradera till inställningen TEMPLATES:

    • TILLÅTET_INKLUDERA_RÖTTER

    • TEMPLATE_KONTEXT_PROCESSORER

    • TEMPLATE_DEBUG

    • TEMPLATE_DIRS

    • TEMPLATE_LADDARE

    • TEMPLATE_STRING_IF_INVALID

  • Det bakåtkompatibla aliaset django.template.loader.BaseLoader tas bort.

  • Django-mallobjekt som returneras av get_template() och select_template() accepterar inte längre en Context i sin render()-metod.

  • Template response APIs genomdriva användningen av dict och backend-beroende mallobjekt istället för Context respektive Template.

  • Parametern current_app för följande funktioner och klasser har tagits bort:

    • django.shortcuts.render()

    • django.template.Context()

    • django.template.RequestContext()`

    • django.template.response.TemplateResponse() ``

  • Parametrarna dictionary och context_instance för följande funktioner har tagits bort:

    • django.shortcuts.render()

    • django.shortcuts.render_to_response()

    • django.template.loader.render_to_string()

  • Parametern dirs fö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 i MIDDLEWARE_CLASSES eller inte. SessionAuthenticationMiddleware har inte längre något syfte och kan tas bort från MIDDLEWARE_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.related har tagits bort.

  • Alternativet --list i hanteringskommandot migrate har tagits bort.

  • Malltaggen ssi har tagits bort.

  • Stöd för jämförelseoperatorn = i malltaggen if har tagits bort.

  • De shims för bakåtkompatibilitet som tillåter att Storage.get_available_name() och Storage.save() definieras utan ett max_length-argument har tagits bort.

  • Stöd för den äldre syntaxen %(<foo>)s i ModelFormMixin.success_url har tagits bort.

  • aggregatmetoderna GeoQuerySet collect(), extent(), extent3d(), make_line() och unionagg() har tagits bort.

  • Möjligheten att ange ContentType.name när man skapar en innehållstypsinstans har tagits bort.

  • Stöd för den gamla signaturen allow_migrate har tagits bort.

  • Stöd för syntaxen för {% cycle %} som använder kommaseparerade argument har tagits bort.

  • Varningen som Signer utfärdade när den fick en ogiltig separator är nu ett ValueError.