---
title: "Django 2.1 versionsinformation"
version: 5.2
locale: sv
source: https://docs.djangoproject.com/sv/5.2/releases/2.1/
canonical: https://djangodocs.dev/sv/5.2/releases/2.1/
---
# Django 2.1 versionsinformation

*1 augusti 2018*

Välkommen till Django 2.1!

Dessa versionsinformation täcker de [nya funktionerna](#whats-new-2-1), samt några [bakåtkompatibla ändringar](#backwards-incompatible-2-1) som du vill vara medveten om när du uppgraderar från Django 2.0 eller tidigare. Vi har [ta bort några funktioner](#removed-features-2-1) som har nått slutet av sin utfasningscykel, och vi har [startat utfasningsprocessen för några funktioner](#deprecated-features-2-1).

Se guiden [Så här uppgraderar du Django till en nyare version](/sv/5.2/howto/upgrade-version/) om du ska uppdatera ett befintligt projekt.

## Kompatibilitet med Python

Django 2.1 stödjer Python 3.5, 3.6 och 3.7. Django 2.0 är den sista versionen som stödjer Python 3.4.  Vi **rekommenderar** starkt och stöder endast officiellt den senaste versionen av varje serie.

## Vad är nytt i Django 2.1

### Modell ”visa” behörighet

En ”view”-behörighet läggs till i modellen [`Meta.default_permissions`](/sv/5.2/ref/models/options/#django.db.models.Options.default_permissions). De nya behörigheterna kommer att skapas automatiskt när du kör [`migrate`](/sv/5.2/ref/django-admin/#django-admin-migrate).

Detta gör det möjligt att ge användare skrivskyddad åtkomst till modeller i admin. [`ModelAdmin.has_view_permission()`](/sv/5.2/ref/contrib/admin/#django.contrib.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](#view-permission-backwards-incompatible).

### Mindre funktioner

#### [`django.contrib.admin`](/sv/5.2/ref/contrib/admin/#module-django.contrib.admin)

- [`ModelAdmin.search_fields`](/sv/5.2/ref/contrib/admin/#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()`](/sv/5.2/ref/contrib/admin/#django.contrib.admin.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](/sv/5.2/ref/contrib/admin/#overriding-default-admin-site).
- Det nya attributet [`ModelAdmin.sortable_by`](/sv/5.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.sortable_by) och metoden [`ModelAdmin.get_sortable_by()`](/sv/5.2/ref/contrib/admin/#django.contrib.admin.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`](/sv/5.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display) kan nu vara ett frågeuttryck.
- Den nya metoden [`ModelAdmin.get_deleted_objects()`](/sv/5.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_deleted_objects) gör det möjligt att anpassa borttagningsprocessen för vyn delete och åtgärden ”delete selected”.
- 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()`](/sv/5.2/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.has_add_permission) skickar nu det överordnade objektet som det andra positionella argumentet, `obj`.
- Adminåtgärder kan nu [specificera behörigheter](/sv/5.2/ref/contrib/admin/actions/#admin-action-permissions) för att begränsa deras tillgänglighet för vissa användare.

#### [`django.contrib.auth`](/sv/5.2/topics/auth/#module-django.contrib.auth)

- [`createsuperuser`](/sv/5.2/ref/django-admin/#django-admin-createsuperuser) ger nu en prompt för att tillåta kringgående av [`AUTH_PASSWORD_VALIDATORS`](/sv/5.2/ref/settings/#std-setting-AUTH_PASSWORD_VALIDATORS)-kontrollerna.

#### [`django.contrib.gis`](/sv/5.2/ref/contrib/gis/#module-django.contrib.gis)

- Den nya metoden [`GEOSGeometry.buffer_with_style()`](/sv/5.2/ref/contrib/gis/geos/#django.contrib.gis.geos.GEOSGeometry.buffer_with_style) är en version av [`buffer()`](/sv/5.2/ref/contrib/gis/geos/#django.contrib.gis.geos.GEOSGeometry.buffer) som gör det möjligt att anpassa buffertens stil.
- [`OpenLayersWidget`](/sv/5.2/ref/contrib/gis/forms-api/#django.contrib.gis.forms.widgets.OpenLayersWidget) är nu baserad på OpenLayers 4.6.5 (tidigare 3.20.1).

#### [`django.contrib.sessions`](/sv/5.2/topics/http/sessions/#module-django.contrib.sessions)

- Lagt till inställningen [`SESSION_COOKIE_SAMESITE`](/sv/5.2/ref/settings/#std-setting-SESSION_COOKIE_SAMESITE) för att ange cookie-flaggan `SameSite` för sessionscookies.

#### Cache

- I [local-memory cache backend](/sv/5.2/topics/cache/#local-memory-caching) används nu en LRU-strategi (least-recently-used) i stället för en pseudoslumpmässig strategi.
- Den nya [`touch()`](/sv/5.2/topics/cache/#django.core.cache.cache.touch)-metoden i [lågnivå cache API](/sv/5.2/topics/cache/#low-level-cache-api) uppdaterar timeouten för cache-nycklar.

#### CSRF

- Lagt till inställningen [`CSRF_COOKIE_SAMESITE`](/sv/5.2/ref/settings/#std-setting-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()`](/sv/5.2/ref/utils/#django.utils.translation.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`](/sv/5.2/ref/django-admin/#cmdoption-inspectdb-include-views) kan du skapa modeller för databasvyer.
- Klassen [`BaseCommand`](/sv/5.2/howto/custom-management-commands/#django.core.management.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**](https://peps.python.org/pep-0487/).
- 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`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.Chr), [`Left`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.Left), [`LPad`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.LPad), [`LTrim`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.LTrim), [`Ord`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.Ord), [`Repeat`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.Repeat), [`Replace`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.Replace), [`Right`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.Right), [`RPad`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.RPad), [`RTrim`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.RTrim), och [`Trim`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.Trim).
- Den nya funktionen [`TruncWeek`](/sv/5.2/ref/models/database-functions/#django.db.models.functions.TruncWeek) trunkerar [`DateField`](/sv/5.2/ref/models/fields/#django.db.models.DateField) och [`DateTimeField`](/sv/5.2/ref/models/fields/#django.db.models.DateTimeField) till måndagen i en vecka.
- Frågeuttryck kan nu negeras med hjälp av ett minustecken.
- [`QuerySet.order_by()`](/sv/5.2/ref/models/querysets/#django.db.models.query.QuerySet.order_by) och [`distinct(*fields)`](/sv/5.2/ref/models/querysets/#django.db.models.query.QuerySet.distinct) stöder nu användning av fälttransformationer.
- [`BooleanField`](/sv/5.2/ref/models/fields/#django.db.models.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()`](/sv/5.2/ref/models/querysets/#django.db.models.query.QuerySet.explain) visar databasens exekveringsplan för en queryset-fråga.
- [`QuerySet.raw()`](/sv/5.2/ref/models/querysets/#django.db.models.query.QuerySet.raw) stöder nu [`prefetch_related()`](/sv/5.2/ref/models/querysets/#django.db.models.query.QuerySet.prefetch_related).

#### Förfrågningar och svar

- Lagt till [`HttpRequest.get_full_path_info()`](/sv/5.2/ref/request-response/#django.http.HttpRequest.get_full_path_info).
- Lade till argumentet `samesite` till [`HttpResponse.set_cookie()`](/sv/5.2/ref/request-response/#django.http.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`](/sv/5.2/ref/templates/builtins/#std-templatefilter-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`](/sv/5.2/topics/testing/tools/#django.test.Client) för 307- och 308-omdirigeringar.
- Test [`Client`](/sv/5.2/topics/testing/tools/#django.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()`](/sv/5.2/topics/testing/tools/#django.test.SimpleTestCase.assertWarnsMessage) är en enklare version av [`assertWarnsRegex()`](https://docs.python.org/3/library/unittest.html#unittest.TestCase.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**](https://peps.python.org/pep-0249/), undantag där en databas inte stöder en funktion ändras från [`NotImplementedError`](https://docs.python.org/3/library/exceptions.html#NotImplementedError) till [`django.db.NotSupportedError`](/sv/5.2/ref/exceptions/#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`](/sv/5.2/ref/contrib/gis/#module-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`](/sv/5.2/ref/settings/#std-setting-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`](/sv/5.2/ref/settings/#std-setting-SESSION_COOKIE_SAMESITE) och/eller [`CSRF_COOKIE_SAMESITE`](/sv/5.2/ref/settings/#std-setting-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()`](/sv/5.2/ref/contrib/admin/#django.contrib.admin.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**](https://datatracker.ietf.org/doc/html/rfc7231.html#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`](/sv/5.2/ref/forms/widgets/#django.forms.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`](/sv/5.2/ref/forms/widgets/#django.forms.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()`](/sv/5.2/ref/contrib/auth/#django.contrib.auth.models.User.has_usable_password) och [`is_password_usable()`](/sv/5.2/topics/auth/passwords/#django.contrib.auth.hashers.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`](/sv/5.2/ref/settings/#std-setting-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()`](/sv/5.2/topics/db/multi-db/#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](/sv/5.2/howto/custom-management-commands/#management-commands-and-locales).
- 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()`](/sv/5.2/ref/models/lookups/#django.db.models.lookups.RegisterLookupMixin.get_lookup) och [`get_lookups()`](/sv/5.2/ref/models/lookups/#django.db.models.lookups.RegisterLookupMixin.get_lookups) i [Lookup Registration API](/sv/5.2/ref/models/lookups/#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](https://pypi.org/project/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`](/sv/5.2/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.ForcePolygonCW)-funktionen.
- `django.utils.http.cookie_date()` är föråldrad till förmån för [`http_date()`](/sv/5.2/ref/utils/#django.utils.http.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()`](/sv/5.2/ref/contrib/admin/#django.contrib.admin.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](/sv/5.2/releases/1.11/#deprecated-features-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.
