# Django 6.0.7 documentation

# Django 1.11 versionsinformation

4 april 2017

Välkommen till Django 1.11!

Dessa versionsinformation täcker nya funktioner, samt några bakåtkompatibla ändringar som du bör vara medveten om när du uppgraderar från Django 1.10 eller äldre versioner. Vi har börjat utfasningsprocessen för vissa funktioner.

Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.

Django 1.11 betecknas som en long-term support release. Den kommer att få säkerhetsuppdateringar i minst tre år efter att den släppts. Stöd för den tidigare LTS, Django 1.8, kommer att upphöra i april 2018.

## Kompatibilitet med Python

Django 1.11 kräver Python 2.7, 3.4, 3.5, 3.6 eller 3.7 (från och med 1.11.17). Vi rekommenderar starkt och stöder endast officiellt den senaste utgåvan av varje serie.

Django 1.11.x-serien är den sista som stöder Python 2. Nästa stora version, Django 2.0, kommer endast att stödja Python 3.4+.

## Föråldrade varningar är inte längre högljudda som standard

Till skillnad från äldre versioner av Django visas inte längre Djangos egna deprecation-varningar som standard. Detta överensstämmer med Pythons standardbeteende.

Denna ändring gör det möjligt för tredjepartsappar att stödja både Django 1.11 LTS och Django 1.8 LTS utan att behöva lägga till kod för att undvika varningar om utfasning.

Efter lanseringen av Django 2.0 föreslår vi att tredjepartsappförfattare släpper stödet för alla versioner av Django före 1.11. Vid den tiden bör du kunna köra ditt pakets tester med `python -Wd` så att varningar om avskrivningar visas. Efter att du har åtgärdat varningarna för utfasning bör din app vara kompatibel med Django 2.0.

## Vad är nytt i Django 1.11

### Klassbaserade modellindex

Den nya modulen `django.db.models.indexes` innehåller klasser som underlättar skapandet av databasindex. Index läggs till i modeller med hjälp av alternativet `Meta.indexes`.

Klassen `Index` skapar ett b-tree index, som om du använt `db_index` på modellfältet eller `index_together` på modellens `Meta` klass. Den kan underklassificeras för att stödja olika indextyper, till exempel `GinIndex`. Det gör det också möjligt att definiera ordningen (ASC/DESC) för kolumnerna i indexet.

### Template-baserad widget-rendering

För att underlätta anpassningen av widgetar görs renderingen av formulärwidgetar nu med hjälp av mallsystemet i stället för i Python. Se API för rendering av formulär.

Du kan behöva justera eventuella anpassade widgetar som du har skrivit för några bakåtkompatibla ändringar.

### uttryck för `Subquery`

De nya databasuttrycken `Subquery` och `Exists` gör det möjligt att skapa explicita underfrågor. Underfrågor kan hänvisa till fält från den yttre frågeuppsättningen med hjälp av klassen `OuterRef`.

### Mindre funktioner

#### `django.contrib.admin`

- `ModelAdmin.date_hierarchy` kan nu referera till fält över relationer.

- Den nya `ModelAdmin.get_exclude()`-hook gör det möjligt att ange de uteslutna fälten baserat på begäran eller modellinstansen.

- Mallen `popup_response.html` kan nu åsidosättas per app, per modell eller genom att ställa in attributet `ModelAdmin.popup_response_template`.

#### `django.contrib.auth`

- Standardantalet iterationer för PBKDF2-lösenordshasher ökas med 20%.

- De klassbaserade vyerna `LoginView` och `LogoutView` ersätter de föråldrade funktionsbaserade vyerna `login()` och `logout()`.

- Klasserna `PasswordChangeView`, `PasswordChangeDoneView`, `PasswordResetView`, `PasswordResetDoneView`, `PasswordResetConfirmView` och `PasswordResetCompleteView` klassbaserade vyer ersätter de föråldrade funktionsbaserade vyerna `password_change()`, `password_change_done()`, `password_reset()`, `password_reset_done()`, `password_reset_confirm()` och `password_reset_complete()`.

- Det nya attributet `post_reset_login` för `PasswordResetConfirmView` gör det möjligt att automatiskt logga in en användare efter en lyckad lösenordsåterställning. Om du har konfigurerat flera `AUTHENTICATION_BACKENDS`, använd attributet `post_reset_login_backend` för att välja vilken som ska användas.

- För att undvika möjligheten att läcka en token för återställning av lösenord via HTTP Referer-headern (till exempel om återställningssidan innehåller en referens till CSS eller JavaScript som finns på en annan domän), lagrar `PasswordResetConfirmView` (men inte den föråldrade `password_reset_confirm()` funktionsbaserade vyn) token i en session och omdirigerar till sig själv för att presentera lösenordsändringsformuläret för användaren utan token i URL.

- `update_session_auth_hash()` roterar nu sessionsnyckeln för att tillåta en lösenordsändring för att ogiltigförklara stulna sessionskakor.

- Det nya attributet `success_url_allowed_hosts` för `LoginView` och `LogoutView` gör det möjligt att ange en uppsättning värdar som är säkra för omdirigering efter inloggning och utloggning.

- Lagt till lösenordsvaliderare `help_text` i `UserCreationForm`.

- `HttpRequest` skickas nu till `authenticate`()` som i sin tur skickar det till autentiseringsbackend om det accepterar ett `request` argument.

- Signalen `user_login_failed()` får nu ett `request` argument.

- `PasswordResetForm` stöder anpassade användarmodeller som använder ett e-postfält som heter något annat än `'email'`. Ställ in `CustomUser.EMAIL_FIELD` till namnet på fältet.

- `get_user_model()` kan nu anropas vid importtillfället, även i moduler som definierar modeller.

#### `django.contrib.contenttypes`

- När inaktuella innehållstyper upptäcks i kommandot `remove_stale_contenttypes`, finns det nu en lista över relaterade objekt som `auth.Permission` som också kommer att raderas. Tidigare listades endast innehållstyperna (och den här prompten fanns efter `migrate` i stället för i ett separat kommando).

#### `django.contrib.gis`

- De nya metoderna `GEOSGeometry.from_gml()` och `OGRGeometry.from_gml()` gör det möjligt att skapa geometrier från GML.

- Lagt till stöd för `dwithin` lookup på SpatiaLite.

- Funktionerna `Area`, `Distance` och avståndsuppslagningar fungerar nu med geodetiska koordinater på SpatiaLite.

- De OpenLayers-baserade formulärwidgetarna använder nu `OpenLayers.js` från `https://cdnjs.cloudflare.com`, vilket är mer lämpligt för produktionsanvändning än den gamla källan `https://openlayers.org/`. De är också uppdaterade för att använda OpenLayers 3.

- PostGIS-migreringar kan nu ändra fältdimensioner.

- Lagt till möjligheten att skicka parametrarna `size`, `shape` och `offset` när du skapar `GDALRaster`-objekt.

- Lagt till SpatiaLite-stöd för `IsValid`-funktionen, `MakeValid`-funktionen och `isvalid` lookup.

- Lagt till Oracle-stöd för funktionen `AsGML`, `BoundingCircle`, `IsValid` och `isvalid`.

#### `django.contrib.postgres`

- Det nya argumentet `distinct` för `StringAgg` avgör om sammanlänkade värden ska vara distinkta.

- De nya klasserna `GinIndex` och `BrinIndex` gör det möjligt att skapa `GIN` och `BRIN` index i databasen.

- `django.contrib.postgres.fields.JSONField` accepterar en ny `encoder` parameter för att ange en anpassad klass för att koda datatyper som inte stöds av standardkodaren.

- Den nya `CIText` mixin och `CITextExtension` migration operation tillåter användning av PostgreSQL `citext` förlängning för skiftlägesokänsliga uppslagningar. Tre fält tillhandahålls: `CICharField`, `CIEmailField` och `CITextField`.

- Den nya `JSONBAgg` tillåter aggregering av värden som en JSON-array.

- `HStoreField` (modellfält) och `HStoreField` (formulärfält) tillåter lagring av nollvärden.

#### Cache

- Memcached-backends skickar nu innehållet i `OPTIONS` som nyckelordsargument till klientkonstruktörerna, vilket möjliggör mer avancerad kontroll av klientbeteendet. Se cache arguments dokumentation för exempel.

- Memcached-backends tillåter nu att flera servrar definieras som en kommaseparerad sträng i `LOCATION`, för att underlätta för tredjepartstjänster som använder sådana strängar i miljövariabler.

#### CSRF

- Lagt till inställningen `CSRF_USE_SESSIONS` för att tillåta lagring av CSRF-token i användarens session i stället för i en cookie.

#### Databas backends

- Added the `skip_locked` argument to `QuerySet.select_for_update()` on PostgreSQL 9.5+ and Oracle to execute queries with `FOR UPDATE SKIP LOCKED`.

- Lade till inställningen `TEST['TEMPLATE']` för att låta PostgreSQL-användare ange en mall för att skapa testdatabasen.

- `QuerySet.iterator()` now uses server-side cursors on PostgreSQL. This feature transfers some of the worker memory load (used to hold query results) to the database and might increase database memory usage.

- Lagt till MySQL-stöd för alternativet `'isolation_level'` i `OPTIONS` för att göra det möjligt att ange transaktionens isoleringsnivå. För att undvika eventuell dataförlust rekommenderas att du byter från MySQL:s standardnivå, repeterbar läsning, till read committed.

- Lagt till stöd för `cx_Oracle` 5.3.

#### E-postadress

- Lagt till inställningen `EMAIL_USE_LOCALTIME` för att tillåta att SMTP-datohuvuden skickas i den lokala tidszonen i stället för UTC.

- `EmailMessage.attach()` och `attach_file()` faller nu tillbaka till MIME-typen application/octet-stream när binärt innehåll som inte kan avkodas som UTF-8 anges för en text/*-bilaga.

#### Fil delning

- För att göra den omslutningsbar av `io.TextIOWrapper`, har `File` nu metoderna `readable()`, `writable()` och `seekable()`.

#### Formulär

- Det nya attributet `empty_value` på `CharField`, `EmailField`, `RegexField`, `SlugField` och `URLField` gör det möjligt att ange Python-värdet som ska användas för att representera ”empty”.

- Den nya `Form.get_initial_for_field()`-metoden returnerar initialdata för ett formulärfält.

#### Internationalisering

- Nummerformatering och inställningen `NUMBER_GROUPING` stöder icke-enhetlig siffergruppering.

#### Kommandon för hantering

- Det nya alternativet `loaddata --exclude` gör det möjligt att utesluta modeller och appar när data laddas från fixturer.

- Det nya alternativet `diffsettings --default` gör det möjligt att ange en annan inställningsmodul än Djangos standardinställningar att jämföra mot.

- argumenten i `app_label` begränsar nu utdata för `showmigrations --plan`.

#### Migreringar

- Lagt till stöd för serialisering av `uuid.UUID`-objekt.

#### Modeller

- Lagt till stöd för anropbara värden i argumentet `defaults` i `QuerySet.update_or_create()` och `get_or_create`()`.

- `ImageField` now has a default `validate_image_file_extension` validator. (This validator moved to the form field in Django 1.11.2.)

- Lagt till stöd för tidstrunkering i `Trunc`-funktioner.

- Lade till funktionen `ExtractWeek` för att extrahera veckan från `DateField` och `DateTimeField` och exponerade den genom `week` lookup.

- Lade till funktionen `TruncTime` för att trunkera `DateTimeField` till dess tidskomponent och exponerade den genom `time` lookup.

- Lagt till stöd för uttryck i `QuerySet.values()` och `values_list()`.

- Lagt till stöd för frågeuttryck på uppslagningar som tar flera argument, t.ex. `range`.

- Du kan nu använda alternativet `unique=True` med `FileField`.

- Lade till parametrarna `nulls_first` och `nulls_last` till `Expression.asc()` och `desc()` för att styra ordningsföljden för null-värden.

- De nya `F`-uttrycken `bitleftshift()` och `bitrightshift()` tillåter bitvisa skiftoperationer.

- Lagt till `QuerySet.union()`, `intersection()` och `difference()`.

#### Förfrågningar och svar

- Lagt till `QueryDict.fromkeys()`.

- `CommonMiddleware` ställer nu in svarshuvudet `Content-Length` för svar som inte strömmas.

- Inställningen `SECURE_HSTS_PRELOAD` lades till för att tillåta att direktivet `preload` läggs till i rubriken `Strict-Transport-Security`.

- `ConditionalGetMiddleware` lägger nu till rubriken `ETag` i svaren.

#### Serialisering

- Det nya attributet `django.core.serializers.base.Serializer.stream_class` gör det möjligt för underklasser att anpassa standardströmmen.

- Den kodare som används av JSON serializer kan nu anpassas genom att skicka ett `cls` nyckelordsargument till funktionen `serializers.serialize()`.

- `DjangoJSONEncoder` serialiserar nu `timedelta`-objekt (används av `DurationField`).

#### Mallar

- `mark_safe()` kan nu användas som dekorator.

- Mallbackend `Jinja2` stöder nu kontextprocessorer genom att ställa in alternativet `'context_processors'` i `OPTIONS`.

- Taggen `regroup` returnerar nu `namedtuple` istället för ordböcker så att du kan packa upp gruppobjektet direkt i en loop, t.ex. `{% for grouper, list in regrouped %}`.

- Lagt till en `resetcycle`-malltagg för att göra det möjligt att återställa sekvensen för `cycle`-malltaggen.

- Du kan nu ange specifika kataloger för en viss `filesystem.Loader <django.template.loaders.filesystem.Loader>``.

#### Tester

- Added `DiscoverRunner.get_test_runner_kwargs()` to allow customizing the keyword arguments passed to the test runner.

- Lagt till alternativet `test --debug-mode` för att underlätta felsökning av testfel genom att sätta inställningen `DEBUG` till `True`.

- De nya funktionerna `django.test.utils.setup_databases()` (flyttad från `django.test.runner`) och `teardown_databases()` gör det enklare att bygga egna testrunners.

- Lagt till stöd för `unittest.TestCase.subTest()`’s vid användning av `test --parallel`.

- `DiscoverRunner` kör nu systemkontrollerna i början av en testkörning. Åsidosätt metoden `DiscoverRunner.run_checks()` om du vill inaktivera detta.

#### Validerare

- Lagt till `FileExtensionValidator` för att validera filtillägg och `validate_image_file_extension` för att validera bildfiler.

## Bakåtkompatibla ändringar i 1.11

### `django.contrib.gis`

- För att förenkla kodbasen och för att det är lättare att installera än när `contrib.gis` först släpptes, är GDAL nu ett obligatoriskt beroende för GeoDjango. I äldre versioner krävs det endast för SQLite.

- `contrib.gis.maps` tas bort eftersom det har ett gränssnitt mot en pensionerad version av Google Maps API och verkar vara ounderhållet. Om du använder det, :ticket:` låt oss veta <14284>`.

- Jämlikhetsoperatorn `GEOSGeometry` jämför nu även SRID.

- De OpenLayers-baserade formulärwidgetarna använder nu OpenLayers 3, och mallarna `gis/openlayers.html` och `gis/openlayers-osm.html` har uppdaterats. Kontrollera ditt projekt om du underklassar dessa widgetar eller utökar mallarna. De nya widgetarna fungerar också lite annorlunda än de gamla. Istället för att använda ett verktygsfält i widgeten klickar du för att rita, klickar och drar för att flytta kartan och klickar och drar en punkt/vertex/hörn för att flytta den.

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

- Stöd för GDAL 1.7 och 1.8 har tagits bort.

- Widgetarna i `contrib.gis.forms.widgets` och admins `OpenLayersWidget` använder form rendering API snarare än `loader.render_to_string()`. Om du använder en anpassad widgetmall måste du se till att din formulärrenderare kan hitta den. Du kan till exempel använda `TemplatesSetting` renderer.

### `django.contrib.staticfiles`

- `collectstatic` kan nu misslyckas under efterbehandlingen när du använder en hashad lagring av statiska filer om det finns en referensloop (t.ex. `'foo.css'` refererar till `'bar.css'` som i sin tur refererar till `'foo.css'`) eller om kedjan av filer som refererar till andra filer är för djup för att lösas i flera omgångar. I det senare fallet ökar du antalet passeringar med `ManifestStaticFilesStorage.max_post_process_passes`.

- När `ManifestStaticFilesStorage` används, ger statiska filer som inte finns i manifestet vid körning nu upphov till ett `ValueError` istället för att returnera en oförändrad sökväg. Du kan återgå till det gamla beteendet genom att ställa in `ManifestStaticFilesStorage.manifest_strict` till `False`.

### Databas backend API

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

- Metoden `DatabaseOperations.time_trunc_sql()` har lagts till för att stödja trunkering av `TimeField`. Den accepterar argumenten `lookup_type` och `field_name` och returnerar lämplig SQL för att trunkera det angivna tidsfältet `field_name` till ett tidsobjekt med endast den angivna specificiteten. Argumentet `lookup_type` kan vara antingen `'hour'`, `'minute'` eller `'second'`.

- Metoden `DatabaseOperations.datetime_cast_time_sql()` har lagts till för att stödja `time` lookup. Den accepterar argumenten `field_name` och `tzname` och returnerar den SQL som krävs för att casta ett datetime-värde till ett tidsvärde.

- För att aktivera stöd för `FOR UPDATE SKIP LOCKED`, ställ in `DatabaseFeatures.has_select_for_update_skip_locked = True`.

- Det nya attributet `DatabaseFeatures.supports_index_column_ordering` anger om en databas tillåter att man definierar ordningsföljd för kolumner i index. Standardvärdet är `True` och metoden `DatabaseIntrospection.get_constraints()` bör innehålla en `'orders'`-nyckel i var och en av de returnerade ordböckerna med en lista över `'ASC'` och/eller `'DESC'`-värden som motsvarar ordningen för varje kolumn i indexet.

- `inspectdb` anropar inte längre `DatabaseIntrospection.get_indexes()` som är föråldrad. Anpassade databasbackends bör säkerställa att alla typer av index returneras av `DatabaseIntrospection.get_constraints()`.

- Döpte om funktionen `ignores_quoted_identifier_case` till `ignores_table_name_case` för att mer exakt återspegla hur den används.

- Nyckelordsargumentet `name` läggs till i metoden `DatabaseWrapper.create_cursor(self, name=None)` för att tillåta användning av markörer på serversidan på backends som stöder det.

### Slopat stöd för PostgreSQL 9.2 och PostGIS 2.0

Uppströmsstöd för PostgreSQL 9.2 slutar i september 2017. Som en följd av detta ställer Django 1.11 PostgreSQL 9.3 som den minsta version som den officiellt stöder.

Stöd för PostGIS 2.0 tas också bort eftersom PostgreSQL 9.2 är den sista versionen som stöder den.

Dessutom har den minsta versionen av psycopg2 som stöds ökats från 2.4.5 till 2.5.4.

### `LiveServerTestCase` binder till port noll

Istället för att ta ett portintervall och iterera för att hitta en ledig port, binder `LiveServerTestCase` till port noll och förlitar sig på att operativsystemet tilldelar en ledig port. Miljövariabeln `DJANGO_LIVE_TEST_SERVER_ADDRESS` används inte längre, och eftersom den inte heller används längre, tas alternativet `manage.py test --liveserver` bort.

Om du behöver binda `LiveServerTestCase` till en specifik port, använd attributet `port` som lades till i Django 1.11.2.

### Skydd mot osäkra omdirigeringar i `django.contrib.auth` och `i18n`-vyer

`LoginView`, `LogoutView` (och de föråldrade funktionsbaserade motsvarigheterna) och `set_language()` skyddar användare från att omdirigeras till icke-HTTPS `next` URL:er när appen körs över HTTPS.

### `QuerySet.get_or_create()` och `update_or_create()` validerar argument

För att förhindra att typfel passerar tyst kontrollerar `get_or_create()` och `update_or_create()` att deras argument är modellfält. Detta bör vara bakåtkompatibelt endast i det faktum att det kan avslöja en bugg i ditt projekt.

### `pytz` är ett obligatoriskt beroende och stöd för `settings.TIME_ZONE = None` har tagits bort

För att förenkla Djangos hantering av tidszoner är `pytz` nu ett nödvändigt beroende. Det installeras automatiskt tillsammans med Django.

Stöd för `settings.TIME_ZONE = None` tas bort eftersom beteendet inte används ofta och är tveksamt användbart. Om du automatiskt vill upptäcka tidszonen baserat på systemets tidszon kan du använda tzlocal:

    from tzlocal import get_localzone

    TIME_ZONE = get_localzone().zone

Detta fungerar på liknande sätt som `settings.TIME_ZONE = None` förutom att det också ställer in `os.environ['TZ']`. låt oss veta <https://groups.google.com/g/django-developers/c/OAV3FChfuPM/discussion>`__ om det finns ett användningsfall där du upptäcker att du inte kan anpassa din kod för att ställa in en `TIME_ZONE`.

### HTML-ändringar i admin-mallar

`<p class="help">` ersätts med en `<div>` tagg för att göra det möjligt att inkludera listor i hjälptexten.

Skrivskyddade fält omsluts av `.<div class="readonly">.</div>.` istället för `.<p>.</p>.` för att tillåta alla typer av HTML som innehåll i fältet.

### Ändringar till följd av införandet av mallbaserad widgetrendering

Vissa odokumenterade klasser i `django.forms.widgets` har tagits bort:

- `SubWidget`

- `RendererMixin`, `ChoiceFieldRenderer`, `RadioFieldRenderer`, `CheckboxFieldRenderer`

- `ChoiceInput`, `RadioChoiceInput`, `CheckboxChoiceInput`

Den odokumenterade metoden `Select.render_option()` har tagits bort.

Metoden `Widget.format_output()` har tagits bort. Använd en anpassad widgetmall istället.

Vissa widgetvärden, till exempel alternativen `<select>`, är nu lokaliserade om `settings.USE_L10N=True`. Du kan återgå till det gamla beteendet med anpassade widgetmallar som använder `localize`-malltaggen för att stänga av lokalisering.

### `django.template.backends.django.Template.render()` förbjuder icke-dict sammanhang

För kompatibilitet med flera mallmotorer måste `django.template.backends.django.Template.render()` (returneras från högnivå API:er för mallladdare som `loader.get_template()`) ta emot en ordbok av kontext snarare än `Context` eller `RequestContext`. Om du skulle skicka någon av de två klasserna, skicka en ordbok istället - att göra det är bakåtkompatibelt med äldre versioner av Django.

### Modellera tillståndsändringar i migreringsoperationer

För att göra migreringar snabbare fördröjs rendering av relaterade modeller tills en åtgärd som behöver dem (t.ex. `RunPython`). Om du har en anpassad operation som arbetar med modellklasser eller modellinstanser från argumentet `from_state` i `database_forwards()` eller `database_backwards()`, måste du rendera modelltillstånd med metoden `clear_delayed_apps_cache()` enligt beskrivningen i writing your own migration operation.

### Markörer på serversidan på PostgreSQL

The change to make `QuerySet.iterator()` use server-side cursors on PostgreSQL prevents running Django with PgBouncer in transaction pooling mode. To reallow that, use the `DISABLE_SERVER_SIDE_CURSORS` setting (added in Django 1.11.1) in `DATABASES`.

Se Transaktionspoolning och cursorer på serversidan för mer information.

### Diverse

- Om inga objekt i flödet har attributen `pubdate` eller `updateddate` returnerar `SyndicationFeed.latest_post_date()` nu aktuellt UTC-datum/tid istället för en datetime utan information om tidszon.

- CSRF-misslyckanden loggas i `django.security.csrf`-loggern istället för `django.request`.

- valideringen av `ALLOWED_HOSTS` är inte längre inaktiverad när tester körs. Om ditt program innehåller tester med anpassade värdnamn måste du inkludera dessa värdnamn i `ALLOWED_HOSTS`. Se Tester och flera värdnamn.

- Om du använder en främmande nyckels ID (t.ex. `'field_id'`) i `ModelAdmin.list_display` visas det relaterade objektets ID. Ta bort suffixet `_id` om du vill ha det gamla beteendet för strängrepresentationen av objektet.

- I modellformulär sparar `CharField` med `null=True` nu `NULL` för tomma värden istället för tomma strängar.

- På Oracle kontrollerar `Model.validate_unique()` inte längre tomma strängar för unikhet eftersom databasen tolkar värdet som `NULL`.

- Om du underklassar `AbstractUser` och åsidosätter `clean()`, se till att den anropar `super()`. `BaseUserManager.normalize_email()` anropas i en ny `AbstractUser.clean()`-metod så att normalisering tillämpas i fall som validering av modellformulär.

- `EmailField` och `URLField` accepterar inte längre nyckelordsargumentet `strip`. Ta bort det eftersom det inte har någon effekt i äldre versioner av Django eftersom dessa fält alltid tar bort blanksteg.

- Attributen `checked` och `selected` som återges av formulärwidgets använder nu HTML5:s booleska syntax i stället för XHTML:s `checked='checked'` och `selected='selected'`.

- `RelatedManager.add()`, `remove()`, `clear()`, och `set()` rensar nu `prefetch_related()`-cachen.

- För att förhindra eventuell förlust av sparade inställningar ger `setup_test_environment()` nu upphov till ett undantag om den anropas en andra gång innan `teardown_test_environment()` anropas.

- Det odokumenterade aliaset `DateTimeAwareJSONEncoder` för `DjangoJSONEncoder` (bytt namn i Django 1.0) tas bort.

- `cached template loader` är nu aktiverad om `OPTIONS['loaders']` inte är specificerad och `OPTIONS['debug']` är `False` (det senare alternativet är standardvärdet för `DEBUG`). Detta kan vara bakåtkompatibelt om du har några template-taggar som inte är trådsäkra.

- Prompten för borttagning av inaktuella innehållstyper visas inte längre efter att kommandot `migrate` har körts. Använd det nya kommandot `remove_stale_contenttypes` istället.

- Administratörens widget för `IntegerField` använder `type="number"` i stället för `type="text"`.

- Villkorliga HTTP-rubriker analyseras och jämförs nu i enlighet med RFC 7232 Conditional Requests-specifikationen i stället för den äldre RFC 2616.

- `patch_response_headers()` lägger inte längre till en `Last-Modified` header. Enligt RFC 7234 Section 4.2.2 är denna rubrik värdelös tillsammans med andra cache-rubriker som ger en explicit utgångstid, t.ex. `Expires` eller `Cache-Control`. `UpdateCacheMiddleware` och `add_never_cache_headers()` anropar `patch_response_headers()` och påverkas därför också av denna ändring.

- I adminmallarna ersätts `<p class="help">` med en `<div>` tagg för att möjliggöra inkludering av listor i hjälptexten.

- `ConditionalGetMiddleware` anger inte längre rubriken `Date` eftersom webbservrar anger den rubriken. Den ställer inte heller längre in rubriken `Content-Length` eftersom detta nu görs av `CommonMiddleware`.

  Om du har ett mellanprogram som ändrar innehållet i ett svar och som visas före `CommonMiddleware` i inställningarna `MIDDLEWARE` eller `MIDDLEWARE_CLASSES` måste du ändra ordningen på mellanprogrammet så att svaren inte ändras efter att `Content-Length` har angetts, eller låta det mellanprogram som ändrar svaret återställa rubriken `Content-Length`.

- `get_model()` och `get_models()` ger nu upphov till `AppRegistryNotReady` om de anropas innan modeller för alla applikationer har laddats. Tidigare krävde de bara att målapplikationens modeller skulle laddas och kunde därför returnera modeller utan att alla deras relationer var inställda. Om du behöver det gamla beteendet hos `get_model()`, sätt argumentet `require_ready` till `False`.

- Det oanvända attributet `BaseCommand.can_import_settings` har tagits bort.

- Den odokumenterade `django.utils.functional.lazy_property` tas bort.

- För konsekvens med icke-multipart-förfrågningar, `MultiPartParser.parse()` lämnar nu `request.POST` oföränderlig. Om du ändrar den `QueryDict`, måste du nu först kopiera den, t.ex. `request.POST.copy()`.

- Stöd för `cx_Oracle` < 5.2 har tagits bort.

- Stöd för IPython < 1.0 har tagits bort från kommandot `shell`.

- Signaturen för det privata API:et `Widget.build_attrs()` ändrades från `extra_attrs=None, **kwargs` till `base_attrs, extra_attrs=None`.

- Filliknande objekt (t.ex. `StringIO` och `BytesIO`) som laddas upp till en `ImageField` med hjälp av testklienten kräver nu ett `name`-attribut med ett värde som passerar `validate_image_file_extension`-validatorn. Se anmärkningen i `Client.post()`.

- `FileField` flyttar nu snarare än kopierar den fil den tar emot. Med standardinställningarna för filuppladdning har filer som är större än `FILE_UPLOAD_MAX_MEMORY_SIZE` nu samma behörigheter som temporära filer (ofta `0o600`) i stället för systemets standard-umask (ofta `0o6644`). Ange `FILE_UPLOAD_PERMISSIONS` om du vill ha samma behörighet oavsett filstorlek.

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

### `modeller.permalink()` dekorator

Använd `django.urls.reverse()` istället. Till exempel:

    from django.db import models

    class MyModel(models.Model):
        ...

        @models.permalink
        def url(self):
            return ("guitarist_detail", [self.slug])

blir:

    from django.db import models
    from django.urls import reverse

    class MyModel(models.Model):
        ...

        def url(self):
            return reverse("guitarist_detail", args=[self.slug])

### Diverse

- `contrib.auth`’s funktionsbaserade vyer `login()` och `logout()` är avförda till förmån för nya klassbaserade vyer `LoginView` och `LogoutView`.

- Den oanvända parametern `extra_context` i `contrib.auth.views.logout_then_login()` är föråldrad.

- `contrib.auth`:s funktionsbaserade vyer `password_change()`, `password_change_done()`, `password_reset()`, `password_reset_done()`, `password_reset_confirm()` och `password_reset_complete()` är föråldrade till förmån för nya klassbaserade vyer `PasswordChangeView`, `PasswordChangeDoneView`, `PasswordResetView`, `PasswordResetDoneView`, `PasswordResetConfirmView`, och `PasswordResetCompleteView`.

- `django.test.runner.setup_databases()` flyttas till `django.test.utils.setup_databases()`. Den gamla platsen är föråldrad.

- `django.utils.translation.string_concat()` är föråldrad till förmån för `django.utils.text.format_lazy()`. `string_concat(*strings)` kan ersättas av `format_lazy('{}' * len(strings), *strings)`.

- För cache-backend `PyLibMCCache` är det föråldrat att skicka `pylibmc` beteendeinställningar som toppnivåattribut för `OPTIONS`. Ställ in dem under en `behaviors` nyckel inom `OPTIONS` istället.

- Parametern `host` i `django.utils.http.is_safe_url()` är föråldrad till förmån för den nya parametern `allowed_hosts`.

- Att tysta undantag som uppstår vid rendering av `{% include %}` malltagg är avskriven eftersom beteendet ofta är mer förvirrande än hjälpsamt. I Django 2.1 kommer undantaget att tas upp.

- `DatabaseIntrospection.get_indexes()` är föråldrad till förmån för `DatabaseIntrospection.get_constraints()`.

- `authenticate()` skickar nu ett `request`-argument till `authenticate()`-metoden för autentiseringsbackends. Stöd för metoder som inte accepterar `request` som det första positionella argumentet kommer att tas bort i Django 2.1.

- Inställningen `USE_ETAGS` är utfasad till förmån för `ConditionalGetMiddleware`` som nu lägger till `ETag`-rubriken till svar oavsett inställning. `CommonMiddleware` och `django.utils.cache.patch_response_headers()` kommer inte längre att ställa in ETags när föråldringen upphör.

- `Model._meta.has_auto_field` är föråldrad till förmån för att kontrollera om `Model._meta.auto_field is not None`.

- Att använda grupper av reguljära uttryck med `iLmsu#` i `url()` är föråldrat. Den enda gruppen som är användbar är `(?i)` för skiftlägesokänsliga webbadresser, men skiftlägesokänsliga webbadresser är inte en bra praxis eftersom de skapar flera poster för sökmotorer, till exempel. En alternativ lösning kan vara att skapa en `handler404` som letar efter versaler i URL:en och omdirigerar till en motsvarighet med gemener.

- Argumentet `renderer` läggs till i metoden `Widget.render()`. Metoder som inte accepterar det argumentet kommer att fungera under en utfasningsperiod.