# Documentazione Django 6.0.7

# Come sovrascrivere i templates

Nel tuo progetto, puoi voler fare override del template in un’altra applicazione Django, che sia una applicazione di terze parti o una applicazione contrib come `django.contrib.admin`. Puoi mettere gli override di template nella directory di template del tuo progetto o nella directory di template dell’applicazione.

Se hai directory di template di app e di progetto che fanno entrambe override, il template loader di default di Django proverà a caricare prima quello a livello di progetto. In altre parole, `DIRS` viene ricercata prima di `APP_DIRS`.

Vedi anche

Leggi Overriding built-in widget templates se stai cercando di fare questo.

## Sovrascrivere la directory dei template del progetto

Innanzitutto, esploreremo come fare override i template creando modelli sostitutivi nella directory dei template del tuo progetto.

Diciamo che stai cercando di fare override del template di una applicazione di terza parte chiamata `blog`, che offre i template `blog/post.html` e `blog/list.html`. Le impostazioni rilevanti avranno questo aspetto:

    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,
            # ...
        },
    ]

Le impostazioni `TEMPLATES` e `BASE_DIR` esisteranno già se hai creato il tuo progetto usando il template di default del progetto. L’impostazione che necessita di essere modificata è `DIRS`.

Queste impostazioni presumono che tu abbia una directory `templates` nella radice del progetto. Per fare override dei template per l’app `blog`, crea un foldere nella directory `templates` ed aggiungi i file di template a quella cartella:

    templates/
        blog/
            list.html
            post.html

Il template loader cerca prima i template nella directory `DIRS`. Quando le viste nell’app `blog` richiedono i template `blog/post.html` e `blog/list.html`, il loader restituirà i file che hai appena creato.

## Sovrascrivere la directory dei template di un’app

Dal momento che stai facendo override dei template situati fuori delle app di progetto, è più comune usare il primo metodo e mettere i template override nella cartella di template del progetto. Se preferisci, comunque, è anche possibile mettere gli override nella directory di template dell’app.

Innanzitutto, assicurati che le impostazioni dei template stiano controllando all’interno delle directory dell’app:

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

Se vuoi mettere gli override di template in una app chiamata `myapp` ed i template da sovrascrivere sono chiamati `blog/list.html` e `blog/post.html` allora la struttura della directory sarà:

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

Con `APP_DIRS` impostato a `True`, il template loader cercherà nella directory di template dell’applicazione e troverà i template.

## Estendere un template sovrascritto

Con i tuoi template loader configurati, puoi estendere un template usando il tag di template `{% extends %}` sovrascrivendolo allo stesso tempo. Questo ti permette di fare piccole personalizzazioni senza necessità di reimplementare l’intero template.

Per esempio, puoi utilizzare questa tecnica per aggiungere un logo personalizzato al template `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 %}

Punti chiave da notare:

- Questo esempio crea un file in `templates/admin/base_site.html` che usa la directory configurata a livello di template `templates` per fare override di `admin/base_site.html`.

- Il nuovo template estende `admin/base_site.html`, che è lo stesso template che è stato sovrascritto.

- Il template sostituisce solo il blocco `branding`, aggiungendo un logo personalizzato e utilizzando `block.super` per mantenere il contenuto precedente.

- Il resto del template è ereditato invariato da `admin/base_site.html`.

Questa tecnica funziona perchè il template loader non considera il template in override già caricato (in `templates/admin/base_site.html`) quando risolve il tag `extends`. In combinazione con `block.super` è una potente tecnica per fare piccole personalizzazioni.