Reference complete du moteur de templates utilise dans Mayan EDMS.
Mayan utilise le moteur Django Templates natif (django.template.backends.django.DjangoTemplates). Tous les tags et filtres customs sont pre-charges en tant que builtins — aucun {% load %} n'est necessaire dans une expression de template.
Fichier cle : mayan/apps/templating/template_backends.py
| Variable | Description | Source |
|---|---|---|
{{ now }} |
Date et heure courantes (timezone.now()) |
templating |
Les variables {{ groups }} et {{ users }} ne sont pas toujours disponibles. Elles doivent etre explicitement demandees par le code qui cree le template.
Pourquoi ? Pour des raisons de performance et de securite : charger tous les utilisateurs et groupes est couteux, et exposer la liste complete des utilisateurs dans un template pourrait constituer une fuite d'information.
Ou sont-elles disponibles ? Principalement dans les lookups de workflows (WorkflowTransitionField.lookup) et les lookups de metadonnees (MetadataType.lookup). Dans ces contextes, les variables groups et users sont explicitement injectees via context_entry_name_list=('groups', 'users').
Exemple concret — un lookup de champ de transition workflow qui verifie si l'utilisateur appartient a un groupe specifique :
{% for group in groups %}
{% if group.name == "RH" %}
{{ workflow_instance.document.label }}
{% endif %}
{% endfor %}
Dans un index de document ou un smart link, {{ groups }} et {{ users }} ne seront pas disponibles — le template echouera silencieusement (variable vide).
templating_tags)| Filtre | Usage | Description |
|---|---|---|
dict_get |
{{ dico\|dict_get:"cle" }} |
Valeur pour une cle de dictionnaire (deprecated, utiliser dictionary_get) |
dictionary_flatten |
{{ dico\|dictionary_flatten }} |
Aplatit un dictionnaire imbrique avec __ comme separateur |
dictionary_get |
{{ dico\|dictionary_get:"cle" }} |
Valeur pour une cle de dictionnaire |
object_flatten |
{{ obj\|object_flatten }} |
Aplatit un objet en dictionnaire avec __ |
split |
{{ texte\|split:"," }} |
Decoupe une chaine par un separateur |
to_base64 |
{{ valeur\|to_base64 }} |
Encode en Base64 |
templating_math_tags)Tous les filtres acceptent int, float, Decimal et chaines numeriques.
| Filtre | Usage |
|---|---|
math_add |
{{ prix\|math_add:10 }} — Addition |
math_absolute |
{{ valeur\|math_absolute }} — Valeur absolue |
math_ceil |
{{ valeur\|math_ceil }} — Arrondi superieur |
math_divide |
{{ total\|math_divide:3 }} — Division |
math_exponentiate |
{{ base\|math_exponentiate:2 }} — Puissance |
math_floor |
{{ valeur\|math_floor }} — Arrondi inferieur |
math_floor_divide |
{{ total\|math_floor_divide:3 }} — Division entiere |
math_integer |
{{ valeur\|math_integer }} — Conversion en entier |
math_maximum |
{{ a\|math_maximum:b }} — Maximum |
math_minimum |
{{ a\|math_minimum:b }} — Minimum |
math_modulo |
{{ valeur\|math_modulo:7 }} — Modulo |
math_multiply |
{{ prix\|math_multiply:1.2 }} — Multiplication |
math_round |
{{ valeur\|math_round:2 }} — Arrondi decimal |
math_square_root |
{{ valeur\|math_square_root }} — Racine carree |
math_subtract |
{{ total\|math_subtract:5 }} — Soustraction |
templating_datetime_tags)| Filtre | Usage |
|---|---|
date_parse_iso |
{{ "2024-01-15"\|date_parse_iso }} — Parse ISO-8601 → datetime |
| Filtre | Usage |
|---|---|
json_load |
{{ json_str\|json_load }} — Deserialise JSON → objet Python |
yaml_dump |
{{ obj\|yaml_dump }} — Convertit en YAML (HTML-safe) |
templating_tags)| Tag | Usage |
|---|---|
method |
{% method objet methode **kwargs %} — Appelle une methode arbitraire. DANGEREUX : desactive par defaut. |
range |
{% range 0 10 2 %} — Retourne une plage d'entiers |
set |
{% set "ma_valeur" %} — Definit une variable de contexte |
spaceless_plus |
{% spaceless_plus %}...{% endspaceless_plus %} — Supprime les lignes vides et espaces entre tags HTML |
templating_math_tags)| Tag | Usage |
|---|---|
math_percent |
{% math_percent valeur total digits=2 default=0 %} — Pourcentage, securise contre division par zero |
templating_datetime_tags)| Tag | Usage |
|---|---|
date_parse |
{% date_parse "15/01/2024" dayfirst=True %} — Parse une date (options : dayfirst, yearfirst, fuzzy, ignoretz) |
timedelta |
{% timedelta date days=7 hours=2 %} — Applique un decalage temporel (supporte tous les kwargs de datetime.timedelta) |
templating_regex_tags)Tous supportent flags : ascii, ignorecase, locale, multiline, dotall, verbose.
| Tag | Usage |
|---|---|
regex_findall |
{% regex_findall "[0-9]+" texte %} — Toutes les occurrences |
regex_match |
{% regex_match "^DEBUT" texte %} — Match au debut |
regex_search |
{% regex_search "pattern" texte %} — Premiere occurrence |
regex_sub |
{% regex_sub "old" "new" texte count=0 %} — Remplacement |
Extraire toutes les valeurs depuis un texte structure :
{% regex_findall "\d{4}-\d{2}-\d{2}" document.label %}
→ Retourne toutes les dates au format YYYY-MM-DD trouvees dans le label du document.
Extraire des montants avec flag insensitive :
{% regex_findall "\$[\d,.]+" document.description flags="ignorecase" %}
Parcourir les resultats avec for :
{% regex_findall "REF-[A-Z0-9]+" document.label as refs %}
{% for ref in refs %}
Reference: {{ ref }}
{% endfor %}
Verifier qu'un document commence par un prefixe :
{% regex_match "^FACT-" document.label %}
→ Retourne l'objet match si le label commence par "FACT-", sinon rien.
Verifier un format avec capture de groupes :
{% regex_match "^(\w+)-(\d{4})$" document.label as m %}
{% if m %}
Type: {{ m.group.1 }} / Annee: {{ m.group.2 }}
{% endif %}
Avec flag multiline (traite chaque ligne comme debut de chaine) :
{% regex_match "^Important:" document.content flags="multiline" %}
| Flag | Python equivalent | Effet |
|---|---|---|
ascii |
re.ASCII |
\w, \b ne matchent que l'ASCII |
ignorecase |
re.IGNORECASE |
Insensible a la casse (A=a) |
locale |
re.LOCALE |
\w, \b dependent de la locale |
multiline |
re.MULTILINE |
^ et $ matchent chaque ligne |
dotall |
re.DOTALL |
. match aussi \n |
verbose |
re.VERBOSE |
Permet les commentaires dans le pattern |
Plusieurs flags se combinent : flags="ignorecase multiline"
IndexTemplateNode.expression rendu avec {{ document }}{{ filename }} ({{ instance.timestamp }}){{ extension }}dynamic_label et condition rendus avec {{ document }}template rendu avec {{ document }}include_regex et exclude_regex sont rendus comme templates avant compilation regexWorkflowTransitionField.default rendu avec {{ workflow_instance }}WorkflowTransitionField.lookup rendu avec {{ workflow_instance }} + {{ groups }} + {{ users }}ModelTemplateFieldMetadataType.defaultMetadataType.lookup avec {{ groups }} + {{ users }}body et subject avec {{ link }}, {{ object }}, {{ object_name }}{{ object }}, {{ user }}, {{ link }}{{ document_file }}input, model, base_url sont des TemplateField| Parametre | Defaut | Description |
|---|---|---|
TEMPLATING_TAGS_DANGEROUS_ALLOW_LIST |
method |
Tags/filtres dangereux autorises (separe par des virgules) |
TEMPLATING_WIDGET_HIGHLIGHT_THEME |
vs2015 |
Theme de coloration syntaxique (200+ choix) |
Mayan fournit une interface interactive pour tester les templates :
`{{ document.datetime_created|date:"Y" }}`/`{{ document.datetime_created|date:"m" }}`
`{{ document.label }}` - `{{ document.uuid }}`
.*\.pdf$
`{{ workflow_instance.document.metadata_value_of.Departement|dict_get:"value" }}` == "RH"
`{% regex_search "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" document.label %}`
Page generee le 2026-05-02 • English version