Django : comment passer une constante à tous vos templates ?
Django, nativement, a la possibilité de passer des dictionnaires clé-valeurs à tous les templates, et dans les templates on accède aux valeurs via la clé.
Exemple concret : je voulais passer le nom de mon site à tous les templates, mais sous forme de constante.
Dans settings.py
j’ai défini ma constante : WEBSITE_NAME = 'mywebsite'
Il suffit de créer une fonction qui renvoie un dictionnaire avec une clé nommée “correctement”, par exemple :
def context_processor_website_name(request):
return {'website_name': WEBSITE_NAME}
Et ensuite, dans les context_processors
, juste ajouter le nom de la fonction par rapport au package où elle est.
J’ai mis cette fonction dans settings.py
.
Je ne sais pas si c’est la meilleure place mais l’idée c’est que comme c’est en rapport avec la configuration de mon site, c’est le meilleur endroit…
Donc pour préciser où est la fonction c’est 'myproject.settings.context_processor_website_name'
:
On retrouve donc le code final comme ceci :
TEMPLATES = [{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
# ... and:
'myproject.settings.context_processor_website_name'
],
},
}, ]
Et voilà, à partir de maintenant, avec exactement 3 lignes de code, j’ai accès à ma variable website_name
, que je peux utiliser ainsi :
<title>{% block title %}{% if title %}{{ title|safe }} - {% endif %}{{ website_name }}{% endblock %}</title>
Petite parenthèse : grâce à ce code, si la page qu’on affiche a un titre, elle aura pour titre : [titre] - [nom du site]
et si elle n’a aucun titre, elle affichera : [nom du site]