Les Crash-Devs d'un Passionné

Créer un filtre jinja pour django

/Catégorie/django

Temps de lecture : 2 minutes

Dans une application Django nous avons besoin d'utiliser les templates surtout si la partie front de votre application n'est pas détachée.

Pour faire le rendu HTML par défaut django utilise

django.template.backends.django.DjangoTemplates

Il est important de noter que cette implémentation est très proche de Jinja mais c'est bien django qui est derrière. Aussi certains filtres jinja ne sont pas accessibles.

Il peut vous arriver du coup de vouloir en ajouter.

Pour cela il suffit de créer un dossier templatetags dans votre application django

A l'intérieur on retrouvera les différents filtres rangés dans des fichiers différents. Créez un fichier html_filter.py où nous allons mettre le code de notre filtre

clipboard
Copier le code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from django import template
from django.template import engines
from lxml.html.clean import Cleaner

def html_filter(value, args):
    cleaner = Cleaner()
    cleaner.allow_tags = args.split(",")
    cleaner.remove_unknown_tags = False
    clean_html = cleaner.clean_html(value)

    template = engines["django"].from_string(clean_html)
    return template.render()

Ce bout de code utilise le parseur LXML qui a une propriété intéressante qui conserve uniquement les tags souhaités

allow_tags

Ensuite on fournit au moteur de template (ici django) cette chaîne afin qu'il n'échappe pas cette balise HTML

template = engines["django"].from_string(clean_html)

Maintenant que notre filtre est créé il faut l'enregistrer, pour cela on utilise

clipboard
Copier le code
1
2
3
4
5
6
7
from django import template

def html_filter(value, args):
  pass

register = template.Library()
register.filter("html_filter", html_filter)

Il nous reste plus qu'à appeler notre filtre dans le moteur de templating

<p>{{ text|html_filter:"a,br" }}</p>

On précise les tags voulus en tant que chaine de caractère séparé par des virgules, juste après le caractère deux points