# Django 6.0.5 documentation

# Hur man åsidosätter mallar

I ditt projekt kanske du vill åsidosätta en mall i en annan Django-applikation, oavsett om det är en tredjepartsapplikation eller en contrib-applikation som `django.contrib.admin`. Du kan antingen lägga mallöverskrivningar i ditt projekts mallkatalog eller i en applikations mallkatalog.

Om du har app- och projektmallskataloger som båda innehåller åsidosättningar, kommer Djangos standardmallsladdare att försöka ladda mallen från projektnivåkatalogen först. Med andra ord söks `DIRS` före `APP_DIRS`.

Se även

Läs Åsidosätta inbyggda widgetmallar om du vill göra det.

## Åsidosättande från projektets mallkatalog

Först ska vi utforska hur du kan åsidosätta mallar genom att skapa ersättningsmallar i projektets mallkatalog.

Låt oss säga att du försöker åsidosätta mallarna för en tredjepartsapplikation som heter `blog`, som tillhandahåller mallarna `blog/post.html` och `blog/list.html`. De relevanta inställningarna för ditt projekt skulle se ut så här:

    from pathlib import Path

    BASE_DIR = Path(__file__).resolve().parent.parent

    INSTALLED_APPS = [
        ...,
        "blog",
        ...,
    ]

    TEMPLATES = [
        {
            "BACKEND": "django.template.backends.django.DjangoTemplates",
            "DIRS": [BASE_DIR / "templates"],
            "APP_DIRS": True,
            # ...
        },
    ]

Inställningen `TEMPLATES` och `BASE_DIR` finns redan om du skapade ditt projekt med hjälp av standardmallen för projektet. Den inställning som behöver ändras är `DIRS`.

Dessa inställningar förutsätter att du har en `templates`-katalog i roten av ditt projekt. Om du vill åsidosätta mallarna för appen `blog` skapar du en mapp i katalogen `templates` och lägger till mallfilerna i den mappen:

    templates/
        blog/
            list.html
            post.html

Mallladdaren letar först efter mallar i katalogen `DIRS`. När vyerna i appen `blog` frågar efter mallarna `blog/post.html` och `blog/list.html` kommer laddaren att returnera de filer som du just har skapat.

## Åsidosätta från en apps mallkatalog

Eftersom du åsidosätter mallar som ligger utanför en av projektets appar är det vanligare att använda den första metoden och lägga mallöverskrivningarna i projektets mallmapp. Om du föredrar det är det dock också möjligt att lägga överskrivningarna i en apps mallkatalog.

Kontrollera först att dina mallinställningar kontrollerar inuti appkataloger:

    TEMPLATES = [
        {
            # ...
            "APP_DIRS": True,
            # ...
        },
    ]

Om du vill lägga mallöverskrivningarna i en app som heter `myapp` och mallarna som ska överskrivas heter `blog/list.html` och `blog/post.html`, kommer din katalogstruktur att se ut som följer:

    myapp/
        templates/
            blog/
                list.html
                post.html

Om `APP_DIRS` är inställd på `True` kommer mallladdaren att leta i appens mallkatalog och hitta mallarna.

## Utöka en åsidosatt mall

Med dina mallladdare konfigurerade kan du utöka en mall med hjälp av `{% extends %}` malltaggen samtidigt som du åsidosätter den. Detta kan göra att du kan göra små anpassningar utan att behöva implementera hela mallen på nytt.

Du kan till exempel använda den här tekniken för att lägga till en egen logotyp i mallen `admin/base_site.html`:

`templates/admin/base_site.html`

     {% extends "admin/base_site.html" %}

     {% block branding %}
       <img src="link/to/logo.png" alt="logo">
       {{ block.super }}
     {% endblock %}

Viktiga punkter att notera:

- I exemplet skapas en fil i `templates/admin/base_site.html` som använder den konfigurerade katalogen `templates` på projektnivå för att åsidosätta `admin/base_site.html`.

- Den nya mallen utökar `admin/base_site.html`, som är samma mall som åsidosätts.

- Mallen ersätter bara blocket `branding`, lägger till en egen logotyp och använder `block.super` för att behålla det tidigare innehållet.

- Resten av mallen ärvs oförändrad från `admin/base_site.html`.

Den här tekniken fungerar eftersom malladdaren inte tar hänsyn till den redan laddade override-mallen (på `templates/admin/base_site.html`) när den löser `extends`-taggen. Kombinerat med `block.super` är det en kraftfull teknik för att göra små anpassningar.