# Django 5.2.8 documentation

# Django 2.1 versionsinformation

1 augusti 2018

Välkommen till Django 2.1!

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 2.0 eller tidigare. 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

Django 2.1 supports Python 3.5, 3.6, and 3.7. Django 2.0 is the last version to support Python 3.4. We highly recommend and only officially support the latest release of each series.

## Vad är nytt i Django 2.1

### Modell ”visa” behörighet

En ”view”-behörighet läggs till i modellen `Meta.default_permissions`. De nya behörigheterna kommer att skapas automatiskt när du kör `migrate`.

Detta gör det möjligt att ge användare skrivskyddad åtkomst till modeller i admin. `ModelAdmin.has_view_permission()` är ny. Implementationen är bakåtkompatibel eftersom det inte finns något behov av att tilldela behörigheten ”view” för att tillåta användare som har behörigheten ”change” att redigera objekt.

Det finns ett par backwards incompatible considerations.

### Mindre funktioner

#### `django.contrib.admin`

- `ModelAdmin.search_fields` accepterar nu alla uppslagsord som `field__exact`.

- jQuery uppgraderas från version 2.2.3 till 3.3.1.

- Den nya metoden `ModelAdmin.delete_queryset()` gör det möjligt att anpassa borttagningsprocessen för åtgärden ”delete selected objects”.

- Du kan nu åsidosätta standardwebbplatsen för administratörer.

- Det nya attributet `ModelAdmin.sortable_by` och metoden `ModelAdmin.get_sortable_by()` gör det möjligt att begränsa de kolumner som kan sorteras på sidan med ändringslistan.

- Attributet `admin_order_field` för element i `ModelAdmin.list_display` kan nu vara ett frågeuttryck.

- The new `ModelAdmin.get_deleted_objects()` method allows customizing the deletion process of the delete view and the ”delete selected” action.

- Mallarna `actions.html`, `change_list_results.html`, `date_hierarchy.html`, `pagination.html`, `prepopulated_fields_js.html`, `search_form.html` och `submit_line.html` kan nu :ref:` åsidosättas per app eller per modell <admin-templates-overridden-per-app-or-model>` (förutom att åsidosättas globalt).

- Verktygen för administratörens ändringslista och ändringsformulärets objekt kan nu åsidosättas per app, per modell eller globalt <admin-templates-overridden-per-app-or-model> med mallarna change_list_object_tools.html och change_form_object_tools.html.

- `InlineModelAdmin.has_add_permission()` skickar nu det överordnade objektet som det andra positionella argumentet, `obj`.

- Adminåtgärder kan nu specificera behörigheter för att begränsa deras tillgänglighet för vissa användare.

#### `django.contrib.auth`

- `createsuperuser` ger nu en prompt för att tillåta kringgående av `AUTH_PASSWORD_VALIDATORS`-kontrollerna.

#### `django.contrib.gis`

- Den nya metoden `GEOSGeometry.buffer_with_style()` är en version av `buffer()` som gör det möjligt att anpassa buffertens stil.

- `OpenLayersWidget` är nu baserad på OpenLayers 4.6.5 (tidigare 3.20.1).

#### `django.contrib.sessions`

- Lagt till inställningen `SESSION_COOKIE_SAMESITE` för att ange cookie-flaggan `SameSite` för sessionscookies.

#### Cache

- I local-memory cache backend används nu en LRU-strategi (least-recently-used) i stället för en pseudoslumpmässig strategi.

- Den nya `touch()`-metoden i lågnivå cache API uppdaterar timeouten för cache-nycklar.

#### CSRF

- Lagt till inställningen `CSRF_COOKIE_SAMESITE` för att ange cookie-flaggan `SameSite` för CSRF-cookies.

#### Formulär

- Widgeten för `ImageField` återges nu med HTML-attributet `accept="image/*"`.

#### Internationalisering

- Lagt till funktionen `get_supported_language_variant()`.

- Oöversatta strängar för territoriella språkvarianter använder nu översättningarna för det generiska språket. Till exempel använder oöversatta `pt_BR`-strängar `pt`-översättningar.

#### Kommandon för hantering

- Med det nya alternativet `inspectdb --include-views` kan du skapa modeller för databasvyer.

- Klassen `BaseCommand` använder nu en anpassad hjälpformatering så att standardalternativ som `--verbosity` eller `--settings` visas sist i hjälputmatningen, vilket ger en mer framträdande position för underklassade kommandos alternativ.

#### Migreringar

- Lagt till stöd för serialisering av `functools.partialmethod`-objekt.

- För att stödja frysta miljöer kan migreringar laddas från `.pyc`-filer.

#### Modeller

- Modeller kan nu använda `__init_subclass__()` från PEP 487.

- En `BinaryField` kan nu ställas in på `editable=True` om du vill inkludera den i modellformulär.

- Ett antal nya textdatabasfunktioner har lagts till: `Chr`, `Left`, `LPad`, `LTrim`, `Ord`, `Repeat`, `Replace`, `Right`, `RPad`, `RTrim`, och `Trim`.

- Den nya funktionen `TruncWeek` trunkerar `DateField` och `DateTimeField` till måndagen i en vecka.

- Frågeuttryck kan nu negeras med hjälp av ett minustecken.

- `QuerySet.order_by()` och `distinct(*fields)` stöder nu användning av fälttransformationer.

- `BooleanField` kan nu vara `null=True`. Detta uppmuntras istället för `NullBooleanField`, som troligen kommer att vara föråldrad i framtiden.

- Den nya metoden `QuerySet.explain()` visar databasens exekveringsplan för en queryset-fråga.

- `QuerySet.raw()` stöder nu `prefetch_related()`.

#### Förfrågningar och svar

- Lagt till `HttpRequest.get_full_path_info()`.

- Lade till argumentet `samesite` till `HttpResponse.set_cookie()` för att tillåta inställning av cookie-flaggan `SameSite`.

- Det nya `as_attachment`-argumentet för `FileResponse`` ställer in `Content-Disposition`-rubriken för att få webbläsaren att fråga om användaren vill ladda ner filen. `FileResponse` försöker också ställa in rubrikerna `Content-Type` och `Content-Length` där det är lämpligt.

#### Mallar

- Det nya filtret `json_script` ger en säker utmatning av ett Python-objekt som JSON, förpackat i en `<script>`-tagg, redo att användas med JavaScript.

#### Tester

- Lagt till stöd för test `Client` för 307- och 308-omdirigeringar.

- Test `Client` serialiserar nu en datadictionary för begäran som JSON om `content_type='application/json'`. Du kan anpassa JSON-kodaren med testklientens parameter `json_encoder`.

- Den nya metoden `SimpleTestCase.assertWarnsMessage()` är en enklare version av `assertWarnsRegex()`.

## Bakåtkompatibla ändringar i 2.1

### Databas backend API

I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.

- För att följa PEP 249, undantag där en databas inte stöder en funktion ändras från `NotImplementedError` till `django.db.NotSupportedError`.

- Bytte namn på databasfunktionsflaggan `allow_sliced_subqueries` till `allow_sliced_subqueries_with_in`.

- `DatabaseOperations.distinct_sql()` kräver nu ett ytterligare `params` argument och returnerar en tupel av SQL och parametrar istället för en SQL-sträng.

- `DatabaseFeatures.introspected_boolean_field_type` ändras från en metod till en egenskap.

### `django.contrib.gis`

- Stöd för SpatiaLite 4.0 har tagits bort.

### Borttaget stöd för MySQL 5.5

Slutet på uppströmsstöd för MySQL 5.5 är december 2018. Django 2.1 stöder MySQL 5.6 och högre.

### Slopat stöd för PostgreSQL 9.3

Slutet på uppströmsstöd för PostgreSQL 9.3 är september 2018. Django 2.1 stöder PostgreSQL 9.4 och högre.

### Tog bort `BCryptPasswordHasher` från standardinställningen `PASSWORD_HASHERS`

Om du använde bcrypt med Django 1.4 eller 1.5 (innan `BCryptSHA256PasswordHasher` lades till i Django 1.6), kanske du har några lösenord som använder `BCryptPasswordHasher` hasher.

Du kan kontrollera om så är fallet på följande sätt:

    from django.contrib.auth import get_user_model

    User = get_user_model()
    User.objects.filter(password__startswith="bcrypt$$")

Om du vill fortsätta att tillåta att dessa lösenord används måste du definiera inställningen `PASSWORD_HASHERS` (om du inte redan gör det) och inkludera `'django.contrib.auth.hashers.BCryptPasswordHasher'`.

### Flyttad `wrap_label` widgetmall kontextvariabel

För att åtgärda avsaknaden av `<label>` när man använder `RadioSelect` och `CheckboxSelectMultiple` med `MultiWidget`, visas nu kontextvariabeln `wrap_label` som ett attribut för varje alternativ. Till exempel, i en anpassad `input_option.html` mall, ändra `{% if wrap_label %}` till `{% if widget.wrap_label %}`.

### `SameSite` kakor

De cookies som används för `django.contrib.sessions`, `django.contrib.messages` och Djangos CSRF-skydd sätter nu flaggan `SameSite` till `Lax` som standard. Webbläsare som respekterar denna flagga kommer inte att skicka dessa cookies på cross-origin-förfrågningar. Om du förlitar dig på det gamla beteendet, ställ in `SESSION_COOKIE_SAMESITE` och/eller `CSRF_COOKIE_SAMESITE` till `None`.

### Överväganden för den nya modellen ”view”-behörighet

#### Anpassade adminformulär måste ta hänsyn till view-only-fallet

Med den nya ”view”-behörigheten kan befintliga anpassade adminformulär ge upphov till fel när en användare inte har ändringsbehörighet eftersom formuläret kan komma åt fält som inte finns. Åtgärda detta genom att åsidosätta `ModelAdmin.get_form()` och kontrollera om användaren har ”change”-behörighet och returnera standardformuläret om så inte är fallet:

    class MyAdmin(admin.ModelAdmin):
        def get_form(self, request, obj=None, **kwargs):
            if not self.has_change_permission(request, obj):
                return super().get_form(request, obj, **kwargs)
            return CustomForm

#### Ny standardvybehörighet kan ge oönskad åtkomst till administratörsvyer

Om du har en anpassad behörighet med ett kodnamn av formen `view_<modelname>`, kommer den nya hanteringen av visningsbehörighet i admin att tillåta visningsåtkomst till ändringslistan och detaljsidorna för dessa modeller. Om detta inte är önskvärt måste du ändra kodnamnet för din anpassade behörighet.

### Diverse

- Den minsta versionen av `mysqlclient` som stöds har ökats från 1.3.3 till 1.3.7.

- Stöd för SQLite < 3.7.15 har tagits bort.

- Datumformatet i `Set-Cookie`’s `Expires` direktiv ändras för att följa RFC 7231 Section 7.1.1.1 istället för Netscapes cookie-standard. Bindestreck i datum som `Tue, 25-Dec-2018 22:26:13 GMT` tas bort. Denna ändring bör endast vara kosmetisk, utom kanske för föråldrade webbläsare som inte tolkar det nya formatet.

- `allowed_hosts` är nu ett obligatoriskt argument för det privata API:et `django.utils.http.is_safe_url()`.

- Attributet `multiple` som återges av widgeten `SelectMultiple` använder nu HTML5:s booleska syntax i stället för XHTML:s `multiple="multiple"`.

- HTML som återges av formulärwidgets innehåller inte längre ett avslutande snedstreck på void-element, t.ex. `<br>`. Detta är inkompatibelt med XHTML, även om vissa widgets redan använder aspekter av HTML5, t.ex. booleska attribut.

- Värdet på `SelectDateWidget`’s empty options ändras från 0 till en tom sträng, vilket huvudsakligen kan kräva vissa justeringar i tester som jämför HTML.

- `User.has_usable_password()` och `is_password_usable()` funktionen returnerar inte längre `False` om lösenordet är `None` eller en tom sträng, eller om lösenordet använder en hasher som inte finns i `PASSWORD_HASHERS` inställningen. Detta odokumenterade beteende var en regression i Django 1.6 och hindrade användare med sådana lösenord från att begära en återställning av lösenordet. Granska din kod för att bekräfta att din användning av dessa API:er inte förlitar sig på det gamla beteendet.

- Eftersom migreringar nu laddas från `.pyc`-filer kan du behöva ta bort dem om du arbetar i en blandad Python 2- och Python 3-miljö.

- Att använda `None` som ett `django.contrib.postgres.fields.JSONField`-uppslagsvärde matchar nu objekt som har den angivna nyckeln och ett null-värde snarare än objekt som inte har nyckeln.

- CSS-klassen för admin `field-box` har bytt namn till `fieldBox` för att förhindra konflikter med den klass som ges till modellfält som heter ”box”.

- Eftersom administratörens mallar `actions.html`, `change_list_results.html`, `date_hierarchy.html`, `pagination.html`, `prepopulated_fields_js.html`, `search_form.html` och `ubmit_line.html` nu kan åsidosättas per app eller per modell, kan du behöva byta namn på befintliga mallar med dessa namn som skrevs för ett annat syfte.

- `QuerySet.raw()` cachelagrar nu sina resultat som vanliga querysets. Använd `iterator()` om du inte vill ha cachelagring.

- Databasroutern `allow_relation()` anropas i fler fall. Felaktigt skrivna routrar kan behöva uppdateras i enlighet med detta.

- Översättningar avaktiveras inte längre innan du kör hanteringskommandon. Om ditt anpassade kommando kräver att översättningar avaktiveras (t.ex. för att infoga oöversatt innehåll i databasen), använd den nya @no_translations decorator.

- Hanteringskommandon tillåter inte längre de förkortade formerna av argumenten `--settings` och `-pythonpath`.

- Den privata konstanten `django.db.models.sql.constants.QUERY_TERMS` tas bort. Metoderna `get_lookup()` och `get_lookups()` i Lookup Registration API kan vara lämpliga alternativ. Jämfört med konstanten `QUERY_TERMS` tillåter de din kod att även ta hänsyn till eventuella anpassade uppslagningar som har registrerats.

- Kompatibiliteten med `py-bcrypt` är borttagen eftersom den inte underhålls. Använd bcrypt istället.

## Funktioner som inte längre är aktuella i 2.1

### Diverse

- GIS-funktionen `ForceRHR` är utfasad till förmån för den nya `ForcePolygonCW`-funktionen.

- `django.utils.http.cookie_date()` är föråldrad till förmån för `http_date()`, som följer formatet i den senaste RFC.

- `{% load staticfiles %}` och `{% load admin_static %}` är avförda till förmån för `{% load static %}`, som fungerar på samma sätt.

- `django.contrib.staticfiles.templatetags.static()` är föråldrad till förmån för `django.templatetags.static.static()`.

- Stöd för `InlineModelAdmin.has_add_permission()`-metoder som inte accepterar `obj` som det andra positionella argumentet kommer att tas bort i Django 3.0.

## Funktioner borttagna i 2.1

Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 2.1. Se Funktioner som inte längre är aktuella i 1.11 för detaljer, inklusive hur man tar bort användningen av dessa funktioner.

- `contrib.auth.views.login()`, `logout()`, `password_change()`, `password_change_done()`, `password_reset()`, `password_reset_done()`, `password_reset_confirm()` och `password_reset_complete()` tas bort.

- Parametern `extra_context` i `contrib.auth.views.logout_then_login()` har tagits bort.

- `django.test.runner.setup_databases()` har tagits bort.

- `django.utils.translation.string_concat()` har tagits bort.

- `django.core.cache.backends.memcached.PyLibMCCache` stöder inte längre att skicka `pylibmc` beteendeinställningar som toppnivåattribut för `OPTIONS`.

- Parametern `host` i `django.utils.http.is_safe_url()` har tagits bort.

- Avstängning av undantag som uppstår vid rendering av malltaggen `{% include %}` har tagits bort.

- `DatabaseIntrospection.get_indexes()` har tagits bort.

- Metoden `authenticate()` för autentiseringsbackends kräver `request` som det första positionella argumentet.

- Dekoratorn `django.db.models.permalink()` har tagits bort.

- Inställningen `USE_ETAGS` är borttagen. `CommonMiddleware` och `django.utils.cache.patch_response_headers()` ställer inte längre in ETags.

- Attributet `Model._meta.has_auto_field` har tagits bort.

- `url()`:s stöd för inline-flaggor i grupper av reguljära uttryck (`(?i)`, `(?L)`, `(?m)`, `(?s)` och `(?u)`) har tagits bort.

- Stöd för `Widget.render()`-metoder utan `renderer`-argumentet har tagits bort.