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

*7 december 2021*

Välkommen till Django 4.0!

Dessa versionsinformation täcker [nya funktioner](#whats-new-4-0), samt några [bakåtkompatibla ändringar](#backwards-incompatible-4-0) som du vill vara medveten om när du uppgraderar från Django 3.2 eller tidigare. Vi har [börjat utfasningsprocessen för vissa funktioner](#deprecated-features-4-0).

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

## Kompatibilitet med Python

Django 4.0 stöder Python 3.8, 3.9 och 3.10. Vi rekommenderar **starkt** och stöder endast officiellt den senaste versionen av varje serie.

Django 3.2.x-serien är den sista som stöder Python 3.6 och 3.7.

## Vad är nytt i Django 4.0

### `zoneinfo` standardimplementering av tidszon

Standardbiblioteket Pythons [`zoneinfo`](https://docs.python.org/3/library/zoneinfo.html#module-zoneinfo) är nu standardimplementeringen av tidszoner i Django.

Detta är nästa steg i migrationen från att använda `pytz` till att använda [`zoneinfo`](https://docs.python.org/3/library/zoneinfo.html#module-zoneinfo). Django 3.2 tillät användning av tidszoner som inte är `pytz`. Django 4.0 gör `zoneinfo` till standardimplementering. Stöd för `pytz` är nu föråldrat och kommer att tas bort i Django 5.0.

[`zoneinfo`](https://docs.python.org/3/library/zoneinfo.html#module-zoneinfo) är en del av Pythons standardbibliotek från Python 3.9. Paketet `backports.zoneinfo` installeras automatiskt tillsammans med Django om du använder Python 3.8.

Övergången till `zoneinfo` bör vara i stort sett transparent. Val av aktuell tidszon, konvertering av datatidsinstanser till aktuell tidszon i formulär och mallar, samt operationer på medvetna datatider i UTC påverkas inte.

Men om du arbetar med tidszoner som inte är UTC och använder API:erna `pytz` `normalize()` och `localize()`, eventuellt med inställningen [`TIME_ZONE`](/sv/6.0/ref/settings/#std-setting-DATABASE-TIME_ZONE), måste du granska din kod eftersom `pytz` och `zoneinfo` inte är helt likvärdiga.

För att ge tid för en sådan granskning tillåter övergångsinställningen `USE_DEPRECATED_PYTZ` fortsatt användning av `pytz` under 4.x releasecykeln. Denna inställning kommer att tas bort i Django 5.0.

Dessutom kan ett [pytz\_deprecation\_shim](https://pytz-deprecation-shim.readthedocs.io/en/latest/index.html)-paket, skapat av `zoneinfo`-författaren, användas för att hjälpa till med migreringen från `pytz`. Detta paket innehåller shims som hjälper dig att ta bort `pytz` på ett säkert sätt och har en detaljerad migreringsguide\` som visar hur man flyttar till de nya `zoneinfo` API:erna.

Att använda [pytz\_deprecation\_shim](https://pytz-deprecation-shim.readthedocs.io/en/latest/index.html) och övergångsinställningen `USE_DEPRECATED_PYTZ` rekommenderas om du behöver en gradvis uppdateringsväg.

### Funktionella unika begränsningar

Det nya [`*expressions`](/sv/6.0/ref/models/constraints/#django.db.models.UniqueConstraint.expressions) positionella argumentet för [`UniqueConstraint()`](/sv/6.0/ref/models/constraints/#django.db.models.UniqueConstraint) gör det möjligt att skapa funktionella unika begränsningar för uttryck och databasfunktioner. Till exempel:

```
from django.db import models
from django.db.models import UniqueConstraint
from django.db.models.functions import Lower

class MyModel(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

    class Meta:
        constraints = [
            UniqueConstraint(
                Lower("first_name"),
                Lower("last_name").desc(),
                name="first_last_name_unique",
            ),
        ]
```

Funktionella unika begränsningar läggs till i modeller med hjälp av alternativet [`Meta.constraints`](/sv/6.0/ref/models/options/#django.db.models.Options.constraints).

### `scrypt` lösenord hasher

Den nya [scrypt password hasher](/sv/6.0/topics/auth/passwords/#scrypt-usage) är säkrare och rekommenderas framför PBKDF2. Det är dock inte standard eftersom det kräver OpenSSL 1.1+ och mer minne.

### Redis cache backend

Den nya `django.core.cache.backends.redis.RedisCache` cache backend ger inbyggt stöd för cachelagring med Redis. [redis-py](https://pypi.org/project/redis/) 3.0.0 eller högre krävs. För mer information, se [dokumentation om cachelagring med Redis i Django](/sv/6.0/topics/cache/#redis).

### Mallbaserad rendering av formulär

[`Forms`](/sv/6.0/ref/forms/api/#django.forms.Form), [Formsets](/sv/6.0/topics/forms/formsets/), och [`ErrorList`](/sv/6.0/ref/forms/api/#django.forms.ErrorList) renderas nu med hjälp av mallmotorn för att förbättra anpassningen. Se nya [`render()`](/sv/6.0/ref/forms/api/#django.forms.Form.render), [`get_context()`](/sv/6.0/ref/forms/api/#django.forms.Form.get_context), och [`template_name`](/sv/6.0/ref/forms/api/#django.forms.Form.template_name) för `Form` och [formset rendering](/sv/6.0/topics/forms/formsets/#formset-rendering) för `Formset`.

### Mindre funktioner

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

- Mallen `admin/base.html` har nu ett nytt block `header` som innehåller administratörssidans rubrik.
- Med den nya metoden [`ModelAdmin.get_formset_kwargs()`](/sv/6.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_formset_kwargs) kan du anpassa de nyckelordsargument som skickas till konstruktören för ett formulär.
- Sidofältet för navigering har nu ett verktygsfält för snabbfilter.
- Den nya kontextvariabeln `model` som innehåller modellklassen för varje modell läggs till i metoden [`AdminSite.each_context()`](/sv/6.0/ref/contrib/admin/#django.contrib.admin.AdminSite.each_context).
- Med det nya attributet [`ModelAdmin.search_help_text`](/sv/6.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_help_text) kan du ange en beskrivande text för sökrutan.
- Attributet [`InlineModelAdmin.verbose_name_plural`](/sv/6.0/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.verbose_name_plural) har nu fallback till attributet [`InlineModelAdmin.verbose_name`](/sv/6.0/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin.verbose_name) \+ `'s'`.
- jQuery uppgraderas från version 3.5.1 till 3.6.0.

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

- Admindocs tillåter nu esoteriska inställningar där [`ROOT_URLCONF`](/sv/6.0/ref/settings/#std-setting-ROOT_URLCONF) inte är en sträng.
- Modellavsnittet i `admindocs` visar nu cachelagrade egenskaper.

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

- Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 260 000 till 320 000.
- Det nya attributet [`LoginView.next_page`](/sv/6.0/topics/auth/default/#django.contrib.auth.views.LoginView.next_page) och metoden [`get_default_redirect_url()`](/sv/6.0/topics/auth/default/#django.contrib.auth.views.LoginView.get_default_redirect_url) gör det möjligt att anpassa omdirigeringen efter inloggning.

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

- Stöd för SpatiaLite 5 har lagts till.
- [`GDALRaster`](/sv/6.0/ref/contrib/gis/gdal/#django.contrib.gis.gdal.GDALRaster) gör det nu möjligt att skapa raster i alla virtuella GDAL-filsystem.
- Den nya [`GISModelAdmin`](/sv/6.0/ref/contrib/gis/admin/#django.contrib.gis.admin.GISModelAdmin)-klassen gör det möjligt att anpassa den widget som används för `GeometryField`. Detta uppmuntras istället för de föråldrade `GeoModelAdmin` och `OSMGeoAdmin`.

#### [`django.contrib.postgres`](/sv/6.0/ref/contrib/postgres/#module-django.contrib.postgres)

- PostgreSQL-backend stöder nu anslutning med ett servicenamn. Se [PostgreSQL-anslutningsinställningar](/sv/6.0/ref/databases/#postgresql-connection-settings) för mer information.
- Den nya [`AddConstraintNotValid`](/sv/6.0/ref/contrib/postgres/operations/#django.contrib.postgres.operations.AddConstraintNotValid) -operationen gör det möjligt att skapa kontrollbegränsningar på PostgreSQL utan att verifiera att alla befintliga rader uppfyller den nya begränsningen.
- Den nya [`ValidateConstraint`](/sv/6.0/ref/contrib/postgres/operations/#django.contrib.postgres.operations.ValidateConstraint)-operationen tillåter validering av kontrollbegränsningar som skapades med [`AddConstraintNotValid`](/sv/6.0/ref/contrib/postgres/operations/#django.contrib.postgres.operations.AddConstraintNotValid) på PostgreSQL.
- Det nya [`ArraySubquery()`](/sv/6.0/ref/contrib/postgres/expressions/#django.contrib.postgres.expressions.ArraySubquery) -uttrycket gör det möjligt att använda underfrågor för att konstruera listor med värden på PostgreSQL.
- Den nya [`trigram_word_similar`](/sv/6.0/ref/contrib/postgres/lookups/#std-fieldlookup-trigram_word_similar) lookupen och [`TrigramWordDistance()`](/sv/6.0/ref/contrib/postgres/search/#django.contrib.postgres.search.TrigramWordDistance) och [`TrigramWordSimilarity()`](/sv/6.0/ref/contrib/postgres/search/#django.contrib.postgres.search.TrigramWordSimilarity) uttrycken tillåter användning av trigramordlikhet.

#### [`django.contrib.staticfiles`](/sv/6.0/ref/contrib/staticfiles/#module-django.contrib.staticfiles)

- [`ManifestStaticFilesStorage`](/sv/6.0/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestStaticFilesStorage) ersätter nu sökvägar till JavaScript-källkartreferenser med deras hashade motsvarigheter.
- Det nya argumentet `manifest_storage` i [`ManifestFilesMixin`](/sv/6.0/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestFilesMixin) och [`ManifestStaticFilesStorage`](/sv/6.0/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.ManifestStaticFilesStorage) gör det möjligt att anpassa manifestfilens lagring.

#### Cache

- Det nya async-API:et för `django.core.cache.backends.base.BaseCache` påbörjar processen med att göra cache-backends async-kompatibla. De nya async-metoderna har alla namn med prefixet `a`, t.ex. `aadd()`, `aget()`, `aset()`, `aget_or_set()` eller `adelete_many()`.

  I fortsättningen kommer prefixet `a` att användas för asynkrona varianter av metoder i allmänhet.

#### CSRF

- CSRF-skydd konsulterar nu `Origin`-huvudet, om det finns. För att underlätta detta krävs [vissa ändringar](#csrf-trusted-origins-changes-4-0) i [`CSRF_TRUSTED_ORIGINS`](/sv/6.0/ref/settings/#std-setting-CSRF_TRUSTED_ORIGINS).

#### Formulär

- [`ModelChoiceField`](/sv/6.0/ref/forms/fields/#django.forms.ModelChoiceField) inkluderar nu det angivna värdet i argumentet `params` i ett uppkommet [`ValidationError`](/sv/6.0/ref/exceptions/#django.core.exceptions.ValidationError) för felmeddelandet `invalid_choice`. Detta gör att anpassade felmeddelanden kan använda platshållaren `%(value)s`.
- [`BaseFormSet`](/sv/6.0/topics/forms/formsets/#django.forms.formsets.BaseFormSet) återger nu fel som inte är formulärfel med en extra klass `nonform` för att hjälpa till att skilja dem från formulärspecifika fel.
- [`BaseFormSet`](/sv/6.0/topics/forms/formsets/#django.forms.formsets.BaseFormSet) gör det nu möjligt att anpassa widgeten som används när formulär raderas via [`can_delete`](/sv/6.0/topics/forms/formsets/#django.forms.formsets.BaseFormSet.can_delete) genom att ställa in attributet [`deletion_widget`](/sv/6.0/topics/forms/formsets/#django.forms.formsets.BaseFormSet.deletion_widget) eller åsidosätta metoden [`get_deletion_widget()`](/sv/6.0/topics/forms/formsets/#django.forms.formsets.BaseFormSet.get_deletion_widget).

#### Internationalisering

- Stöd och översättningar för det malaysiska språket har lagts till.

#### Generiska åsikter

- [`DeleteView`](/sv/6.0/ref/class-based-views/generic-editing/#django.views.generic.edit.DeleteView) använder nu [`FormMixin`](/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin), vilket gör att du kan tillhandahålla en [`Form`](/sv/6.0/ref/forms/api/#django.forms.Form)-underklass, med till exempel en kryssruta, för att bekräfta radering. Dessutom gör detta att `DeleteView` kan fungera med [`django.contrib.messages.views.SuccessMessageMixin`](/sv/6.0/ref/contrib/messages/#django.contrib.messages.views.SuccessMessageMixin).

  I enlighet med `FormMixin` hanteras radering av objekt för POST-begäranden i `form_valid()`. Anpassad raderingslogik i `delete()`-hanterare bör flyttas till `form_valid()`, eller en delad hjälpmetod, efter behov.

#### Loggning

- Aliaset för den databas som används i ett SQL-anrop skickas nu som extra kontext tillsammans med varje meddelande till loggern [django.db.backends](/sv/6.0/ref/logging/#django-db-logger).

#### Kommandon för hantering

- Hanteringskommandot [`runserver`](/sv/6.0/ref/django-admin/#django-admin-runserver) stöder nu alternativet [`--skip-checks`](/sv/6.0/ref/django-admin/#cmdoption-skip-checks).
- På PostgreSQL stöder [`dbshell`](/sv/6.0/ref/django-admin/#django-admin-dbshell) nu att ange en lösenordsfil.
- The [`shell`](/sv/6.0/ref/django-admin/#django-admin-shell) command now respects [`sys.__interactivehook__`](https://docs.python.org/3/library/sys.html#sys.__interactivehook__)
  at startup. This allows loading shell history between interactive sessions.
  As a consequence, `readline` is no longer loaded if running in *isolated*
  mode.
- Det nya attributet [`BaseCommand.suppressed_base_arguments`](/sv/6.0/howto/custom-management-commands/#django.core.management.BaseCommand.suppressed_base_arguments) gör det möjligt att undertrycka standardkommandoalternativ som inte stöds i hjälputmatningen.
- De nya alternativen [`startapp --exclude`](/sv/6.0/ref/django-admin/#cmdoption-startapp-exclude) och [`startproject --exclude`](/sv/6.0/ref/django-admin/#cmdoption-startproject-exclude) gör det möjligt att utesluta kataloger från mallen.

#### Modeller

- Ny [`QuerySet.contains(obj)`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.contains)-metod returnerar om queryset innehåller det givna objektet. Detta försöker utföra frågan på det enklaste och snabbaste sättet som möjligt.
- Det nya argumentet `precision` i databasfunktionen [`Round()`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.Round) gör det möjligt att ange antalet decimaler efter avrundning.
- [`QuerySet.bulk_create()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create) ställer nu in primärnyckeln på objekt när SQLite 3.35+ används.
- [`DurationField`](/sv/6.0/ref/models/fields/#django.db.models.DurationField) har nu stöd för att multiplicera och dividera med skalära värden på SQLite.
- [`QuerySet.bulk_update()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.bulk_update) returnerar nu antalet objekt som uppdaterats.
- Det nya attributet [`Expression.empty_result_set_value`](/sv/6.0/ref/models/expressions/#django.db.models.Expression.empty_result_set_value) gör det möjligt att ange ett värde som ska returneras när funktionen används för en tom resultatmängd.
- The `skip_locked` argument of [`QuerySet.select_for_update()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update) is now
  allowed on MariaDB 10.6+.
- [`Lookup`](/sv/6.0/ref/models/lookups/#django.db.models.Lookup)-uttryck kan nu användas i `QuerySet`-annoteringar, aggregeringar och direkt i filter.
- Det nya argumentet [default](/sv/6.0/ref/models/querysets/#aggregate-default) för inbyggda aggregat gör det möjligt att ange ett värde som ska returneras när frågeuppsättningen (eller grupperingen) inte innehåller några poster, i stället för `None`.

#### Förfrågningar och svar

- Klassen :~django.middleware.security.SecurityMiddleware lägger nu till rubriken [Cross-Origin Opener Policy](/sv/6.0/ref/middleware/#cross-origin-opener-policy) med värdet `'same-origin'` för att förhindra att popup-fönster med olika ursprung delar samma webbläsarkontext. Du kan förhindra att detta huvud läggs till genom att ange inställningen [`SECURE_CROSS_ORIGIN_OPENER_POLICY`](/sv/6.0/ref/settings/#std-setting-SECURE_CROSS_ORIGIN_OPENER_POLICY) till `None`.

#### Signaler

- The new `stdout` argument for [`pre_migrate()`](/sv/6.0/ref/signals/#django.db.models.signals.pre_migrate)
  and [`post_migrate()`](/sv/6.0/ref/signals/#django.db.models.signals.post_migrate) signals allows redirecting
  output to a stream-like object. It should be preferred over
  [`sys.stdout`](https://docs.python.org/3/library/sys.html#sys.stdout) and [`print()`](https://docs.python.org/3/library/functions.html#print) when emitting verbose output in
  order to allow proper capture when testing.

#### Mallar

- [`floatformat`](/sv/6.0/ref/templates/builtins/#std-templatefilter-floatformat) mallfilter tillåter nu användning av suffixet `u` för att tvinga fram inaktivering av lokalisering.

#### Tester

- Det nya `serialized_aliases`-argumentet i [`django.test.utils.setup_databases()`](/sv/6.0/topics/testing/advanced/#django.test.utils.setup_databases) bestämmer vilka [`DATABASES`](/sv/6.0/ref/settings/#std-setting-DATABASES)-alias-testdatabaser som ska ha sitt tillstånd serialiserat för att möjliggöra användning av [serialized\_rollback](/sv/6.0/topics/testing/overview/#test-case-serialized-rollback)-funktionen.
- Alternativet [`test --buffer`](/sv/6.0/ref/django-admin/#cmdoption-test-buffer) stöder nu parallella tester.
- The new `logger` argument to [`DiscoverRunner`](/sv/6.0/topics/testing/advanced/#django.test.runner.DiscoverRunner)
  allows a Python [logger](https://docs.python.org/3/library/logging.html#logger) to be used for logging.
- Den nya metoden [`DiscoverRunner.log()`](/sv/6.0/topics/testing/advanced/#django.test.runner.DiscoverRunner.log) ger ett sätt att logga meddelanden som använder `DiscoverRunner.logger`, eller skriver ut till konsolen om den inte är inställd.
- [`DiscoverRunner`](/sv/6.0/topics/testing/advanced/#django.test.runner.DiscoverRunner) kan nu utföra tester i en slumpmässig ordning med hjälp av [`test --shuffle`](/sv/6.0/ref/django-admin/#cmdoption-test-shuffle).
- Alternativet [`test --parallel`](/sv/6.0/ref/django-admin/#cmdoption-test-parallel) stöder nu värdet `auto` för att köra en testprocess för varje processorkärna.
- [`TestCase.captureOnCommitCallbacks()`](/sv/6.0/topics/testing/tools/#django.test.TestCase.captureOnCommitCallbacks) fångar nu upp nya callbacks som läggs till när man kör [`transaction.on_commit()`](/sv/6.0/topics/db/transactions/#django.db.transaction.on_commit) callbacks.

## Bakåtkompatibla ändringar i 4.0

### Databas backend API

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

- metoderna `DatabaseOperations.year_lookup_bounds_for_date_field()` och `year_lookup_bounds_for_datetime_field()` tar nu det valfria argumentet `iso_year` för att stödja gränser för ISO-8601 veckonumrerade år.
- Det andra argumentet i metoderna `DatabaseSchemaEditor._unique_sql()` och `_create_unique_sql()` är nu `fields` istället för `columns`.

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

- Stöd för PostGIS 2.3 har tagits bort.
- Stöd för GDAL 2.0 och GEOS 3.5 har tagits bort.

### Tappat stöd för PostgreSQL 9.6

Uppströmsstöd för PostgreSQL 9.6 slutar i november 2021. Django 4.0 stöder PostgreSQL 10 och högre.

Dessutom ökas den minsta versionen som stöds av `psycopg2` från 2.5.4 till 2.8.4, eftersom `psycopg2` 2.8.4 är den första utgåvan som stöder Python 3.8.

### Borttaget stöd för Oracle 12.2 och 18c

Uppströmsstöd för Oracle 12.2 upphör i mars 2022 och för Oracle 18c upphör det i juni 2021. Django 3.2 kommer att stödjas fram till april 2024. Django 4.0 stöder officiellt Oracle 19c.

### `CSRF_TRUSTED_ORIGINS` ändringar

#### Formatändring

Värden i inställningen [`CSRF_TRUSTED_ORIGINS`](/sv/6.0/ref/settings/#std-setting-CSRF_TRUSTED_ORIGINS) måste innehålla schemat (t.ex. `'http://'` eller `'https://'`) i stället för bara värdnamnet.

Dessutom måste värden som börjar med en punkt nu också innehålla en asterisk före punkten. Ändra till exempel `.example.com` till `'https://*.example.com'`.

En systemkontroll upptäcker eventuella nödvändiga ändringar.

#### Konfigurering av den kan nu krävas

Eftersom CSRF-skydd nu konsulterar rubriken `Origin` kan du behöva ställa in [`CSRF_TRUSTED_ORIGINS`](/sv/6.0/ref/settings/#std-setting-CSRF_TRUSTED_ORIGINS), särskilt om du tillåter förfrågningar från underdomäner genom att ställa in [`CSRF_COOKIE_DOMAIN`](/sv/6.0/ref/settings/#std-setting-CSRF_COOKIE_DOMAIN) (eller [`SESSION_COOKIE_DOMAIN`](/sv/6.0/ref/settings/#std-setting-SESSION_COOKIE_DOMAIN) om [`CSRF_USE_SESSIONS`](/sv/6.0/ref/settings/#std-setting-CSRF_USE_SESSIONS) är aktiverat) till ett värde som börjar med en punkt.

### `SecurityMiddleware` ställer inte längre in rubriken `X-XSS-Protection`

Klassen:~django.middleware.security.SecurityMiddleware ställer inte längre in rubriken `X-XSS-Protection` om inställningen `SECURE_BROWSER_XSS_FILTER` är `True`. Inställningen är borttagen.

De flesta moderna webbläsare respekterar inte HTTP-rubriken `X-XSS-Protection`. Du kan använda [Content-Security-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy) utan att tillåta `'unsafe-inline'`-skript istället.

Om du vill stödja äldre webbläsare och ställa in rubriken, använd den här raden i en anpassad middleware:

```
response.headers.setdefault("X-XSS-Protection", "1; mode=block")
```

### Migrationer autodetektor förändringar

Autodetektorn för migreringar använder nu modelltillstånd i stället för modellklasser. Dessutom anger migreringsåtgärder för fälten `ForeignKey` och `ManyToManyField` inte längre attribut som inte skickades till fälten under initialiseringen.

Som en bieffekt kan körning av `makemigrations` generera no-op `AlterField` operationer för `ManyToManyField` och `ForeignKey` fält i vissa fall.

### `DeleteView` ändringar

[`DeleteView`](/sv/6.0/ref/class-based-views/generic-editing/#django.views.generic.edit.DeleteView) använder nu [`FormMixin`](/sv/6.0/ref/class-based-views/mixins-editing/#django.views.generic.edit.FormMixin) för att hantera POST-begäranden. Som en följd av detta bör all anpassad borttagningslogik i `delete()`-hanterare flyttas till `form_valid()`, eller en delad hjälpmetod, om så krävs.

### Ändringar i namnschemat för tabeller och kolumner i Oracle

Django 4.0 ändrade oavsiktligt namnschemat för tabeller och kolumner på Oracle. Detta orsakar fel för modeller och fält med namn som är längre än 30 tecken. Tyvärr krävs det att vissa Oracle-tabeller och kolumner byter namn. Använd uppgraderingsskriptet i [33789](https://code.djangoproject.com/ticket/33789#comment:15) för att generera `RENAME`-satser för att ändra namngivningsschemat.

### Diverse

- Stöd för `cx_Oracle` \< 7.0 har tagits bort.
- För att möjliggöra servering av en Django-webbplats på en underväg utan att ändra värdet på [`STATIC_URL`](/sv/6.0/ref/settings/#std-setting-STATIC_URL), tas det inledande snedstrecket bort från den inställningen (nu `'static/'`) i standardmallen [`startproject`](/sv/6.0/ref/django-admin/#django-admin-startproject).
- Metoden [`AdminSite`](/sv/6.0/ref/contrib/admin/#django.contrib.admin.AdminSite) för adminvyn `index` dekoreras inte längre med `never_cache` när den nås direkt, snarare än via den rekommenderade egenskapen `AdminSite.urls` eller metoden `AdminSite.get_urls()`.
- Operationer som inte stöds på en skivad queryset ger nu upphov till `TypeError` istället för `AssertionError`.
- Den odokumenterade funktionen `django.test.runner.reorder_suite()` har bytt namn till `reorder_tests()`. Den accepterar nu en iterabel av tester snarare än en testsvit och returnerar en iterator av tester.
- Anrop av `FileSystemStorage.delete()` med ett tomt `namn` ger nu upphov till `ValueError` istället för `AssertionError`.
- Anrop av `EmailMultiAlternatives.attach_alternative()` eller `EmailMessage.attach()` med ogiltiga `content` eller `mimetype` argument ger nu upphov till `ValueError` istället för `AssertionError`.
- [`assertHTMLEqual()`](/sv/6.0/topics/testing/tools/#django.test.SimpleTestCase.assertHTMLEqual) anser inte längre att ett icke-booleskt attribut utan värde är lika med ett attribut med samma namn och värde.
- Tester som inte laddas, t.ex. på grund av syntaxfel, matchar nu alltid när man använder [`test --tag`](/sv/6.0/ref/django-admin/#cmdoption-test-tag).
- Den odokumenterade funktionen `django.contrib.admin.utils.lookup_needs_distinct()` har bytt namn till `lookup_spawns_duplicates()`.
- Den odokumenterade metoden `HttpRequest.get_raw_uri()` tas bort. Metoden [`HttpRequest.build_absolute_uri()`](/sv/6.0/ref/request-response/#django.http.HttpRequest.build_absolute_uri) kan vara ett lämpligt alternativ.
- Argumentet `object` i de odokumenterade metoderna `ModelAdmin.log_addition()`, `log_change()` och `log_deletion()` har bytt namn till `obj`.
- [`RssFeed`](/sv/6.0/ref/utils/#django.utils.feedgenerator.RssFeed), [`Atom1Feed`](/sv/6.0/ref/utils/#django.utils.feedgenerator.Atom1Feed), och deras underklasser emitterar nu element utan innehåll som självstängande taggar.
- `NodeList.render()` kastar inte längre utdata från `render()`-metoden för enskilda noder till en sträng. `Node.render()` bör alltid returnera en sträng som dokumenterat.
- Egenskapen `where_class` i `django.db.models.sql.query.Query` och argumentet `where_class` till den privata metoden `get_extra_restriction()` i `ForeignObject` och `ForeignObjectRel` tas bort. Om det behövs, initiera `django.db.models.sql.where.WhereNode` istället.
- Argumentet `filter_clause` i den odokumenterade metoden `Query.add_filter()` ersätts av två positionella argument `filter_lhs` och `filter_rhs`.
- [`CsrfViewMiddleware`](/sv/6.0/ref/middleware/#django.middleware.csrf.CsrfViewMiddleware) använder nu `request.META['CSRF_COOKIE_NEEDS_UPDATE']` i stället för `request.META['CSRF_COOKIE_USED']`, `request.csrf_cookie_needs_reset` och `response.csrf_cookie_set` för att spåra om CSRF-cookien ska skickas. Detta är ett odokumenterat, privat API.
- Den odokumenterade konstanten `TRANSLATOR_COMMENT_MARK` flyttas från `django.template.base` till `django.utils.translation.template`.
- Argumentet `real_apps` i den odokumenterade metoden `django.db.migrations.state.ProjectState.__init__()` måste nu vara ett set om det tillhandahålls.
- [`RadioSelect`](/sv/6.0/ref/forms/widgets/#django.forms.RadioSelect) och [`CheckboxSelectMultiple`](/sv/6.0/ref/forms/widgets/#django.forms.CheckboxSelectMultiple) widgets återges nu i `<div>` taggar så att de meddelas mer koncist av skärmläsare. Om du behöver det tidigare beteendet, [åsidosätt widgetmallen](/sv/6.0/ref/forms/renderers/#overriding-built-in-widget-templates) med lämplig mall från Django 3.2.
- Mallfiltret [`floatformat`](/sv/6.0/ref/templates/builtins/#std-templatefilter-floatformat) är inte längre beroende av inställningen `USE_L10N` och returnerar alltid lokaliserad utdata. Använd suffixet `u` för att inaktivera lokalisering.
- Standardvärdet för inställningen `USE_L10N` ändras till `True`. Se [Lokaliseringsavsnittet](#use-l10n-deprecation) ovan för mer information.
- Som en del av [flytta till zoneinfo](#whats-new-4-0), `django.utils.timezone.utc` ändras till alias `` datetime.timezone.utc` ``.
- Den lägsta versionen av `asgiref` som stöds har ökats från 3.3.2 till 3.4.1.

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

### Användning av `pytz` tidszoner

Som en del av [flytten till zoneinfo](#whats-new-4-0) är användningen av tidszonerna `pytz` avförd.

Följaktligen är argumenten `is_dst` till följande också föråldrade:

- [`django.db.models.query.QuerySet.datetimes()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.datetimes)
- [`django.db.models.functions.Trunc()`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.Trunc)
- [`django.db.models.functions.TruncSecond()`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.TruncSecond)
- [`django.db.models.functions.TruncMinute()`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.TruncMinute)
- [`django.db.models.functions.TruncHour()`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.TruncHour)
- [`django.db.models.functions.TruncDay()`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.TruncDay)
- [`django.db.models.functions.TruncWeek()`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.TruncWeek)
- [`django.db.models.functions.TruncMonth()`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.TruncMonth)
- [`django.db.models.functions.TruncQuarter()`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.TruncQuarter)
- [`django.db.models.functions.TruncYear()`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.TruncYear)
- [`django.utils.timezone.make_aware()`](/sv/6.0/ref/utils/#django.utils.timezone.make_aware)

Stöd för användning av `pytz` kommer att tas bort i Django 5.0.

### Stöd för tidszoner

För att följa god praxis kommer standardvärdet för inställningen [`USE_TZ`](/sv/6.0/ref/settings/#std-setting-USE_TZ) att ändras från `False` till `True`, och stöd för tidszoner kommer att aktiveras som standard i Django 5.0.

Observera att standardfilen `settings.py` som skapats av [`django-admin startproject`](/sv/6.0/ref/django-admin/#django-admin-startproject) innehåller [`USE_TZ = True`](/sv/6.0/ref/settings/#std-setting-USE_TZ) sedan Django 1.4.

Du kan ställa in `USE_TZ` till `False` i dina projektinställningar innan dess för att välja bort.

### Lokalisering

För att följa god praxis har standardvärdet för inställningen `USE_L10N` ändrats från `False` till `True`.

Dessutom är `USE_L10N` föråldrad från och med denna utgåva. Från och med Django 5.0 kommer som standard alla datum eller nummer som visas av Django att vara lokaliserade.

Taggen [`{% localize %}`](/sv/6.0/topics/i18n/formatting/#std-templatetag-localize) och filtren [`localize`](/sv/6.0/topics/i18n/formatting/#std-templatefilter-localize)/ [`unlocalize`](/sv/6.0/topics/i18n/formatting/#std-templatefilter-unlocalize) kommer fortfarande att respekteras av Django.

### Diverse

- testinställningen `SERIALIZE` är avskriven eftersom den kan härledas från [`databases`](/sv/6.0/topics/testing/tools/#django.test.TestCase.databases) med alternativet [serialized\_rollback](/sv/6.0/topics/testing/overview/#test-case-serialized-rollback) aktiverat.
- Den odokumenterade modulen `django.utils.baseconv` är föråldrad.
- Den odokumenterade modulen `django.utils.datetime_safe` är föråldrad.
- Standardprotokollet för webbplatskartor för webbplatskartor som byggs utanför kontexten för en begäran kommer att ändras från `'http` till `'https` i Django 5.0.
- Argumentet `extra_tests` för [`DiscoverRunner.build_suite()`](/sv/6.0/topics/testing/advanced/#django.test.runner.DiscoverRunner.build_suite) och [`DiscoverRunner.run_tests()`](/sv/6.0/topics/testing/advanced/#django.test.runner.DiscoverRunner.run_tests) är föråldrat.
- Aggregaten [`ArrayAgg`](/sv/6.0/ref/contrib/postgres/aggregates/#django.contrib.postgres.aggregates.ArrayAgg), [`JSONBAgg`](/sv/6.0/ref/contrib/postgres/aggregates/#django.contrib.postgres.aggregates.JSONBAgg) och [`StringAgg`](/sv/6.0/ref/contrib/postgres/aggregates/#django.contrib.postgres.aggregates.StringAgg) returnerar `None` när det inte finns några rader istället för `[]`, `[]` respektive `''` i Django 5.0. Om du behöver det tidigare beteendet, ställ uttryckligen in `default` till `Value([])`, `Value('[]')` eller `Value('')`.
- Klasserna `django.contrib.gis.admin.GeoModelAdmin` och `OSMGeoAdmin` är föråldrade. Använd [`ModelAdmin`](/sv/6.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin) och [`GISModelAdmin`](/sv/6.0/ref/contrib/gis/admin/#django.contrib.gis.admin.GISModelAdmin) istället.
- Eftersom formulärrendering nu använder mallmotorn, är den odokumenterade hjälpmetoden `BaseForm._html_output()` föråldrad.
- Möjligheten att returnera en `str` från `ErrorList` och `ErrorDict` är föråldrad. Det förväntas att dessa metoder returnerar en `SafeString`.

## Funktioner borttagna i 4.0

Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 4.0.

Se [Funktioner som inte längre är aktuella i 3.0](/sv/6.0/releases/3.0/#deprecated-features-3-0) för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.

- `django.utils.http.urlquote()`, `urlquote_plus()`, `urlunquote()` och `urlunquote_plus()` tas bort.
- `django.utils.encoding.force_text()` och `smart_text()` tas bort.
- `django.utils.translation.ugettext()`, `ugettext_lazy()`, `ugettext_noop()`, `ungettext()` och `ungettext_lazy()` tas bort.
- `django.views.i18n.set_language()` ställer inte in användarens språk i `request.session` (nyckel `_language`).
- `alias=None` krävs i signaturen för underklasserna `django.db.models.Expression.get_group_by_cols()`.
- `django.utils.text.unescape_entities()` har tagits bort.
- `django.utils.http.is_safe_url()` har tagits bort.

Se [Funktioner som inte längre är aktuella i 3.1](/sv/6.0/releases/3.1/#deprecated-features-3-1) för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.

- Inställningen `PASSWORD_RESET_TIMEOUT_DAYS` tas bort.
- Uppslagsfunktionen [`isnull`](/sv/6.0/ref/models/querysets/#std-fieldlookup-isnull) tillåter inte längre att icke-booleska värden används som höger sida.
- Undantagsklassen `django.db.models.query_utils.InvalidQuery` har tagits bort.
- Ingångspunkten `django-admin.py` tas bort.
- Metoden `HttpRequest.is_ajax()` har tagits bort.
- Stöd för kodningsformatet före Django 3.1 för cookie-värden som används av `django.contrib.messages.storage.cookie.CookieStorage` har tagits bort.
- Stöd för lösenordsåterställningstoken från före Django 3.1 på administratörssidan (som använder SHA-1-hashalgoritmen) har tagits bort.
- Stöd för kodningsformatet för sessioner före Django 3.1 har tagits bort.
- Stöd för signaturer från före Django 3.1 `django.core.signing.Signer` (kodade med SHA-1-algoritmen) har tagits bort.
- Stöd för signaturer från före Django 3.1 `django.core.signing.dumps()` (kodade med SHA-1-algoritmen) i `django.core.signing.loads()` har tagits bort.
- Stöd för användarsessioner före Django 3.1 (som använder SHA-1-algoritmen) har tagits bort.
- Argumentet `get_response` för `django.utils.deprecation.MiddlewareMixin.__init__()` är obligatoriskt och accepterar inte `None`.
- Argumentet `providing_args` för `django.dispatch.Signal` har tagits bort.
- Argumentet `length` för `django.utils.crypto.get_random_string()` är obligatoriskt.
- Meddelandet `list` för `ModelMultipleChoiceField` har tagits bort.
- Stöd för att skicka råa kolumnaliaser till `QuerySet.order_by()` har tagits bort.
- Modellfältet `NullBooleanField` tas bort, med undantag för stöd i historiska migreringar.
- `django.conf.urls.url()` har tagits bort.
- Modellfältet `django.contrib.postgres.fields.JSONField` tas bort, förutom för stöd i historiska migreringar.
- `django.contrib.postgres.fields.jsonb.KeyTransform` och `django.contrib.postgres.fields.jsonb.KeyTextTransform` tas bort.
- `django.contrib.postgres.forms.JSONField` har tagits bort.
- Malltaggarna `{% ifequal %}` och `{% ifnotequal %}` tas bort.
- Övergångsinställningen `DEFAULT_HASHING_ALGORITHM` tas bort.
