Comment désactiver le codage HTML lors de l'utilisation de Context dans django
-
04-07-2019 - |
Question
Dans mon application Django, j'utilise un modèle pour construire le corps de l'e-mail. L'un des paramètres est url. Notez qu'il existe deux paramètres séparés par une esperluette dans l'URL.
t = loader.get_template("sometemplate")
c = Context({
'foo': 'bar',
'url': 'http://127.0.0.1/test?a=1&b=2',
})
print t.render(c)
Après le rendu, il génère: http://127.0.0.1/test?a=1&b=2
Notez que l'esperluette est codée en HTML en tant que "& amp; amp;". Une solution au problème consiste à transmettre chaque paramètre séparément à mon modèle et à construire l’URL dans le modèle, mais j’aimerais éviter de le faire.
Existe-t-il un moyen de désactiver le codage HTML des paramètres de contexte ou au moins d'éviter le codage d'esperluettes?
La solution
Pour le désactiver pour une seule variable, utilisez mark_safe
:
from django.utils.safestring import mark_safe
t = loader.get_template("sometemplate")
c = Context({
'foo': 'bar',
'url': mark_safe('http://127.0.0.1/test?a=1&b=2'),
})
print t.render(c)
Vous pouvez également désactiver totalement le calage automatique de votre code Python en utilise l'argument autoescape
lors de l'initialisation d'un contexte
:
c = Context({
'foo': 'bar',
'url': 'http://127.0.0.1/test?a=1&b=2',
}, autoescape=False)
Le Comment activer [HTML automatique échappement] off de la documentation couvre certaines des options incluses dans le modèle si vous préférez le faire ici.
Autres conseils
Ou utilisez simplement le " safe " filtrer dans votre modèle.
De plus, je ne saurais trop insister sur l’importance de connaître la documentation de Django; De nombreuses questions courantes comme celle-ci ont des réponses et des explications faciles à trouver ( comme celle-ci ), et en lisant la documentation et en ayant une idée du fonctionnement de tout, vous réduirez considérablement le temps que vous devez dépenser. Demandez-lui pourquoi il l'a fait. et augmentez le temps que vous passez à construire des choses qui fonctionnent comme vous le souhaitez.