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 katalogentemplates
på projektnivå för att åsidosättaadmin/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änderblock.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.