# Django 5.2.8 documentation

# 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.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`

- Distance lookups accepterar nu uttryck som parametern för avståndsvärdet.

- Den nya egenskapen `GEOSGeometry.unary_union` beräknar föreningen av alla element i denna geometri.

- Lade till `GEOSGeometry.covers()` binärt predikat.

- Lade till metoden `GDALBand.statistics()` och attributen `mean` och `std`.

- Lagt till stöd för `MakeLine`-aggregatet och `GeoHash`-funktionen på SpatiaLite.

- Lagt till stöd för funktionerna `Difference`, `Intersection` och `SymDifference` på MySQL.

- Stöd för instansiering av tomma GEOS-geometrier har lagts till.

- De nya egenskaperna `trim` och `precision` i `WKTWriter` gör det möjligt att styra utmatningen av bråkdelen av koordinaterna i WKT.

- Lagt till egenskaperna `LineString.closed` och `MultiLineString.closed`.

- Serien GeoJSON serializer matar nu ut primärnyckeln för objekt i ordlistan `properties` om 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 `IsValid` och `MakeValid`, samt `isvalid` lookup, 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 `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 naturliga nycklar.

#### `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 enklare anpassa 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

- Lagringsbackends presenterar nu ett tidszonsmedvetet API med nya metoder `get_accessed_time()`, `get_created_time()` och `get_modified_time()`. De returnerar en tidszonsmedveten `datatid` om `USE_TZ` är `True` och en naiv `datatid` i den lokala tidszonen annars.

- Den nya `Storage.generate_filename()`-metoden gör det enklare att implementera anpassade lagringsenheter som inte använder `os.path`-anropen som tidigare fanns i `FileField`.

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

- Added `HttpResponse` methods `readable()` and `seekable()` to make an instance a stream-like object and allow wrapping it with `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

- För att bättre fånga upp buggar kontrollerar `TestCase` nu 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 --tag` och `test --exclude-tag`.

- Du kan nu logga in och använda sessioner med testklienten även om `django.contrib.sessions` inte finns i `INSTALLED_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 take `FORCE_SCRIPT_NAME` into account when it is set.

#### 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`.

### `select_related()` förbjuder icke-relationella fält för nästlade relationer

Django 1.8 har lagt till validering för icke-relationella fält i `select_related()`:

    >>> Book.objects.select_related("title")
    Traceback (most recent call last):
    ...
    FieldError: Non-relational field given in select_related: 'title'

Men det förbjöd inte nästlade icke-relationsfält som det gör nu:

    >>> Book.objects.select_related("author__name")
    Traceback (most recent call last):
    ...
    FieldError: Non-relational field given in select_related: 'name'

### `_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ö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:

- `DATA_UPLOAD_MAX_MEMORY_SIZE` begränsar hur stor en begäran får vara. Filuppladdningar räknas inte in i denna gräns.

- `DATA_UPLOAD_MAX_NUMBER_FIELDS` begrä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 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.

- 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_field` attribute of `RangeField` is now a type of field, not an instance of a field. If you have created a custom subclass of `RangeField`, you should change the `base_field` attribute.

- 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 `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).

### Använda ett modellnamn som en frågeuppslagning när `default_related_name` är inställt

Antag följande modeller:

    from django.db import models

    class Foo(models.Model):
        pass

    class Bar(models.Model):
        foo = models.ForeignKey(Foo)

        class Meta:
            default_related_name = "bars"

I äldre versioner kunde `default_related_name` inte användas som en frågeuppslagning. Detta är åtgärdat och stöd för det gamla uppslagsnamnet är avskrivet. Till exempel, eftersom `default_related_name` är inställt i modellen `Bar`, istället för att använda modellnamnet `bar` som uppslagsord:

    >>> bar = Bar.objects.get(pk=1)
    >>> Foo.objects.get(bar=bar)

använd det förvalda_relaterade_namnet `bars`:

    >>> Foo.objects.get(bars=bar)

### `__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:
        ...

### Anpassade managerklasser som är tillgängliga via `prefetch_related` måste definiera en `_apply_rel_filters()`-metod

Om du har definierat en anpassad managerklass som är tillgänglig via `prefetch_related()` måste du se till att den definierar en metod `_apply_rel_filters()`.

Denna metod måste acceptera en `QuerySet`-instans som sitt enda argument och returnera en filtrerad version av queryset för den modellinstans som chefen är bunden till.

### ”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.

### `Manager.use_for_related_fields` och ändringar i arv

`Manager.use_for_related_fields` är föråldrad till förmån för att ställa in `Meta.base_manager_name` på modellen.

Modellens `Manager`-arv kommer att följa MRO-arvsreglerna i Django 2.0, vilket ändrar det nuvarande beteendet där managers som definieras på icke-abstrakta basklasser inte ärvs av underordnade klasser. En deprecating-varning med instruktioner om hur du anpassar din kod kommer att visas om du har några påverkade managers. Du kommer antingen att omdefiniera en chef från en abstrakt modell på barnklassen för att åsidosätta chefen från den konkreta modellen, eller så ställer du in modellens `Meta.manager_inheritance_from_future=True`-alternativ för att välja in det nya arvbeteendet.

Under utfasningsperioden kommer `use_for_related_fields` att respekteras och ge upphov till en varning, även om ett `base_manager_name` är angivet. Detta gör att tredjepartskod kan bevara äldre beteende samtidigt som den övergår till det nya API:et. Varningen kan tystas genom att ställa in `silence_use_for_related_fields_deprecation=True` på hanteraren.

### 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_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_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_id` på `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 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 template objects returned by `get_template()` and `select_template()` no longer accept a `Context` in their `render()` method.

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