# Django 5.2.8 documentation

# Django 5.2 versionsinformation

2 april 2025

Välkommen till Django 5.2!

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 5.1 eller tidigare. 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 5.2 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 4.2, kommer att upphöra i april 2026.

## Kompatibilitet med Python

Django 5.2 har stöd för Python 3.10, 3.11, 3.12, 3.13 och 3.14 (från och med 5.2.8). Vi rekommenderar starkt och stöder endast officiellt den senaste utgåvan av varje serie.

## Vad är nytt i Django 5.2

### Automatisk import av modeller i `shell`

Hanteringskommandot `shell` importerar nu automatiskt modeller från alla installerade appar. Du kan visa ytterligare detaljer om de importerade objekten genom att ställa in flaggan `--verbosity` till 2 eller mer:

/ 

    $ python -Wall manage.py shell --verbosity=2
    6 objects imported automatically, including:

      from django.contrib.admin.models import LogEntry
      from django.contrib.auth.models import Group, Permission, User
      from django.contrib.contenttypes.models import ContentType
      from django.contrib.sessions.models import Session

    ...\> py -Wall manage.py shell --verbosity=2
    6 objects imported automatically, including:

      from django.contrib.admin.models import LogEntry
      from django.contrib.auth.models import Group, Permission, User
      from django.contrib.contenttypes.models import ContentType
      from django.contrib.sessions.models import Session

Detta beteende kan anpassas för att lägga till eller ta bort automatisk import.

### Sammansatta primära nycklar

Den nya `django.db.models.CompositePrimaryKey` gör det möjligt att skapa tabeller med en primärnyckel som består av flera fält.

För att använda en sammansatt primärnyckel måste du när du definierar en modell ange att attributet `pk` ska vara en `CompositePrimaryKey`:

    from django.db import models

    class Release(models.Model):
        pk = models.CompositePrimaryKey("version", "name")
        version = models.IntegerField()
        name = models.CharField(max_length=20)

Se Sammansatta primärnycklar för mer information.

### Förenklad åsidosättning av `BoundField`

Prior to version 5.2, overriding `Field.get_bound_field()` was the only option to use a custom `BoundField`. Django now supports specifying the following attributes to customize form rendering:

- `BaseRenderer.bound_field_class` på projektnivå,

- `Form.bound_field_class` på formulärnivå, och

- `Field.bound_field_class` på fältnivå.

Till exempel, för att anpassa `BoundField` i en `Form` klass:

    from django import forms

    class CustomBoundField(forms.BoundField):

        custom_class = "custom"

        def css_classes(self, extra_classes=None):
            result = super().css_classes(extra_classes)
            if self.custom_class not in result:
                result += f" {self.custom_class}"
            return result.strip()

    class CustomForm(forms.Form):
        bound_field_class = CustomBoundField

        name = forms.CharField(
            label="Your Name",
            max_length=100,
            required=False,
            widget=forms.TextInput(attrs={"class": "name-input-class"}),
        )
        email = forms.EmailField(label="Your Email")

Vid rendering av en `CustomForm`-instans inkluderas följande HTML:

    <div class="custom">
      <label for="id_name">Your Name:</label>
      <input type="text" name="name" class="name-input-class" maxlength="100" id="id_name">
    </div>

    <div class="custom">
      <label for="id_email">Your Email:</label>
      <input type="email" name="email" maxlength="320" required="" id="id_email">
    </div>

Se Anpassa BoundField för mer information om denna funktion.

### Mindre funktioner

#### `django.contrib.admin`

- Mallen `admin/base.html` har nu ett nytt block extrabody för att lägga till anpassad kod före den avslutande taggen `</body>`.

- Värdet på en `URLField` återges nu som en länk.

#### `django.contrib.admindocs`

- Länkar till komponenter i dokumentationssträngar stöder nu anpassad länktext, med formatet `:role:`link text <link>`. Se dokumentationshjälpmedel för mer information.

- modellsidor är nu begränsade till användare med motsvarande visnings- eller ändringsbehörighet.

#### `django.contrib.auth`

- Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 870.000 till 1.000.000.

- Följande nya asynkrona metoder tillhandahålls nu, med prefixet `a`:

  - `UserManager.acreate_user()`

  - `UserManager.acreate_superuser()`

  - `BaseUserManager.aget_by_natural_key()`

  - `User.aget_user_permissions()`

  - `User.aget_all_permissions()`

  - `User.aget_group_permissions()`

  - `User.ahas_perm()`

  - `User.ahas_perms()`

  - `User.ahas_module_perms()`

  - `ModelBackend.aauthenticate()`

  - `ModelBackend.aget_user_permissions()`

  - `ModelBackend.aget_group_permissions()`

  - `ModelBackend.aget_all_permissions()`

  - `ModelBackend.ahas_perm()`

  - `ModelBackend.ahas_module_perms()`

  - `RemoteUserBackend.aauthenticate()`

  - `RemoteUserBackend.aconfigure_user()`

- Auth-backends kan nu tillhandahålla asynkrona implementationer som används när man anropar asynkrona auth-funktioner (t.ex. `aauthenticate()`) för att minska kontextväxling vilket förbättrar prestanda. Se lägga till ett async-gränssnitt för mer information.

- Klasserna password validator har nu en ny metod `get_error_message()`, som kan åsidosättas i underklasser för att anpassa felmeddelandena.

#### `django.contrib.gis`

- GDAL stöder nu kurvgeometrierna `CurvePolygon`, `CompoundCurve`, `CircularString`, `MultiSurface` och `MultiCurve` via den nya egenskapen `OGRGeometry.has_curve` och metoderna `OGRGeometry.get_linear_geometry()` och `OGRGeometry.get_curve_geometry()`.

- `coveredby` och `covers` stöds nu av MySQL.

#### `django.contrib.syndication`

- Alla `SyndicationFeed`-klasser stöder nu ett `stylesheets`-attribut. Om det anges kommer en `<? xml-stylesheet ?>` bearbetningsinstruktion att läggas till högst upp i dokumentet för varje stylesheet i den angivna listan. Se Mata in formatmallar för mer information.

#### Databas backends

- MySQL-anslutningar använder nu som standard teckenuppsättningen `utf8mb4` i stället för `utf8`, som är ett alias för den föråldrade teckenuppsättningen `utf8mb3`.

- Oracle backends stöder nu connection pools, genom att ställa in `"pool"` i `OPTIONS`-delen av din databaskonfiguration.

#### Dekoratörer

- `method_decorator()` stöder nu omslag för asynkrona vymetoder.

#### E-postadress

- Tupelobjekt i `EmailMessage.attachments` och `EmailMultiAlternatives.attachments` heter nu tuplar, i motsats till vanliga tuplar.

- `EmailMultiAlternatives.alternatives` är nu en lista med namngivna tupler, i motsats till vanliga tupler.

- Den nya metoden `body_contains()` returnerar en boolean som anger om en angiven text ingår i e-postmeddelandets `body` och i alla bifogade MIME-typ `text/*`-alternativ.

#### Felrapportering

- Attributet `SafeExceptionReporterFilter.hidden_settings` behandlar nu värden som känsliga om deras namn innehåller `AUTH`.

#### Formulär

- Den nya formulärwidgeten `ColorInput` är till för att ange en färg i hexadecimalt format `rrggbb` och återges som `<input type="color" ...>`. Vissa webbläsare stöder ett visuellt färgväljargränssnitt för den här inmatningstypen.

- Den nya `SearchInput`-form widgeten är till för att skriva in sökfrågor och återges som `<input type="search" ...>`.

- Den nya formulärwidgeten `TelInput` är avsedd för inmatning av telefonnummer och återges som `<input type="tel" ...>`.

- Det nya argumentet `field_id` för `ErrorList` gör att ett HTML-attribut `id` kan läggas till i felmallen. Se `ErrorList.field_id` för detaljer.

- En `aria_describedby`-egenskap läggs till i `BoundField` för att underlätta användningen av detta HTML-attribut i mallar.

- För att förbättra tillgängligheten för skärmläsaranvändare används `aria-describedby` för att associera formulärfält med deras felmeddelanden. Se hur formulärfel visas för mer information.

- Det nya tillgångsobjektet `Script` är tillgängligt för att lägga till anpassade HTML-attribut till JavaScript i formulärmedia. Se paths as objects för mer information.

#### Kommandon för hantering

- En ny varning visas när du kör `runserver`, vilket indikerar att den är olämplig för produktion. Denna varning kan undertryckas genom att ställa in miljövariabeln `DJANGO_RUNSERVER_HIDE_WARNING` till `"true"`.

- Kommandona `makemigrations` och `migrate` har fått ett nytt attribut `Command.autodetector` som underklasser kan åsidosätta för att använda en anpassad autodetektorklass.

- Den nya metoden `BaseCommand.get_check_kwargs()` kan åsidosättas i anpassade kommandon för att styra körningen av systemkontroller, t.ex. för att välja databasberoende kontroller.

#### Migreringar

- Den nya operationen `AlterConstraint` är en no-op-operation som ändrar begränsningar utan att ta bort och återskapa begränsningar i databasen.

#### Modeller

- Klausulen `SELECT` som genereras när man använder `QuerySet.values()` och `QuerySet.values_list()` matchar nu den angivna ordningen på de refererade uttrycken. Tidigare baserades ordningen på en uppsättning kontraintuitiva regler som gjorde det oförutsägbart att kombinera frågor med hjälp av metoder som `QuerySet.union()`.

- Lagt till stöd för validering av modellbegränsningar som använder en `GeneratedField`.

- Det nya attributet `Expression.set_returning` anger att uttrycket innehåller en set-returning-funktion, vilket tvingar fram utvärdering av underfrågor. Detta är nödvändigt för många av Postgres set-returning-funktioner.

- `CharField.max_length` behöver inte längre anges i SQLite, som stöder obegränsade `VARCHAR`-kolumner.

- `QuerySet.explain()` stöder nu alternativen `` minne`` och `` serialize`` på PostgreSQL 17+.

- Den nya databasfunktionen `JSONArray` accepterar en lista med fältnamn eller uttryck och returnerar en JSON-array som innehåller dessa värden.

- Det nya attributet `Expression.allows_composite_expressions` anger att uttrycket tillåter sammansatta uttryck, t.ex. för att stödja sammansatta primärnycklar.

#### Förfrågningar och svar

- Den nya egenskapen `HttpResponse.text` ger en strängrepresentation av `HttpResponse.content`.

- Den nya metoden `HttpRequest.get_preferred_type()` kan användas för att fråga efter den föredragna mediatyp som klienten accepterar.

- Det nya argumentet `preserve_request` för `HttpResponseRedirect` och `HttpResponsePermanentRedirect` avgör om HTTP-statuskoderna 302/307 respektive 301/308 ska användas.

- Det nya argumentet `preserve_request` för `redirect()` gör det möjligt att instruera användaragenten att återanvända HTTP-metoden och -kroppen under omdirigering med specifika statuskoder.

#### Serialisering

- Varje serialiseringsformat definierar nu en `Deserializer`-klass, snarare än en funktion, för att förbättra utbyggbarheten när man definierar ett anpassat serialiseringsformat.

#### Mallar

- Den nya `simple_block_tag()`-dekoratorn gör det möjligt att skapa enkla block-taggar, som kan acceptera och använda ett avsnitt av mallen.

#### Tester

- Stack frames från Djangos anpassade assertions är nu dolda. Detta gör testfel lättare att läsa och gör det möjligt för `test --pdb` att direkt gå in i den misslyckade testmetoden.

- Data som laddats från `fixtures` och från migreringar som aktiverats med serialized_rollback=True är nu tillgängliga under `TransactionTestCase.setUpClass()`.

#### URL:er

- `reverse()` och `reverse_lazy()` accepterar nu nyckelordsargumenten `query` och `fragment`, vilket gör det möjligt att lägga till en frågesträng och/eller fragmentidentifierare i den genererade URL:en.

#### Verktyg

- `SafeString` now returns `NotImplemented` in `__add__` for non-string right-hand side values. This aligns with the `str` addition behavior and allows `__radd__` to be used if available.

- `format_html_join()` stöder nu att ta en iterabel av mappningar och skicka deras innehåll som nyckelordsargument till `format_html()`.

## Bakåtkompatibla ändringar i 5.2

### Databas backend API

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

- Den nya metoden `Model._is_pk_set()` gör det möjligt att kontrollera om en modellinstans primärnyckel är definierad.

- `BaseDatabaseOperations.adapt_decimalfield_value()` är nu ett no-op, som bara returnerar det angivna värdet.

### `django.contrib.gis`

- Stöd för PostGIS 3.0 har tagits bort.

- Stöd för GDAL 3.0 har tagits bort.

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

Uppströmsstöd för PostgreSQL 13 slutar i november 2025. Django 5.2 stöder PostgreSQL 14 och högre.

### Ändrad standard för teckenuppsättning för MySQL-anslutning

MySQL-anslutningar använder nu som standard teckenuppsättningen `utf8mb4` istället för `utf8`, som är ett alias för den föråldrade teckenuppsättningen `utf8mb3`. `utf8mb3` kan anges i `OPTIONS`-delen av inställningen `DATABASES`, om det behövs för äldre databaser.

### Diverse

- Att lägga till `EmailMultiAlternatives.alternatives` stöds nu endast via metoden `attach_alternative()`.

- Den lägsta versionen av `gettext` som stöds har höjts från 0.15 till 0.19.

- `HttpRequest.accepted_types` sorteras nu efter klientens preferens, baserat på begäran `Accept` header.

- Attributen `UniqueConstraint.violation_error_code` och `UniqueConstraint.violation_error_message` används nu alltid när de anges. Tidigare ignorerades de om `UniqueConstraint.fields` angavs utan `UniqueConstraint.condition`.

- Kontextprocessorn `debug()` ingår inte längre i standardmallen för projekt.

- Följande metoder har nu `alters_data=True` inställt för att förhindra sidoeffekter när rendering av en mallkontext:

  - `UserManager.create_user()`

  - `UserManager.acreate_user()`

  - `UserManager.create_superuser()`

  - `UserManager.acreate_superuser()`

  - `QuerySet.create()`

  - `QuerySet.acreate()`

  - `QuerySet.bulk_create()`

  - `QuerySet.abulk_create()`

  - `QuerySet.get_or_create()`

  - `QuerySet.aget_or_create()`

  - `QuerySet.update_or_create()`

  - `QuerySet.aupdate_or_create()`

- Den minsta versionen av `oracledb` som stöds har ökats från 1.3.2 till 2.3.0.

- Inbyggda aggregatfunktioner som bara accepterar ett argument (`Avg`, `Count`, `Max`, `Min`, `StdDev`, `Sum` och `Variance`) ger nu upphov till `TypeError` när de anropas med ett felaktigt antal argument.

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

### Diverse

- Argumentet `all` för funktionen `django.contrib.staticfiles.finders.find()` är utfasat till förmån för argumentet `find_all`.

- Fallbacks till `request.user` och `request.auser()` när `user` är `None` i `django.contrib.auth.login()` respektive `django.contrib.auth.alogin()` är föråldrade.

- Nyckelordsargumentet `ordering` för de PostgreSQL-specifika aggregeringsfunktionerna `django.contrib.postgres.aggregates.ArrayAgg`, `django.contrib.postgres.aggregates.JSONBAgg` och `django.contrib.postgres.aggregates.StringAgg` är avskrivet till förmån för `order_by`-argumentet.

- Stöd för subklasser av `RemoteUserMiddleware` som åsidosätter `process_request()` utan att åsidosätta `aprocess_request()` är föråldrat.