DjangoでMarkdownを使う時はsafe(autoescape)を使わないとタグが表示されない
2023.02.18
Markdown を使うときは templatetags で定義した関数を使います。
<div>{{ article | parse | safe }}</div>
article は view から受けとった Markdown の文章です。parse は Markdown を HTML にする関数で、templatetags で定義されているとします。
x | f
は f(x)
を意味するため、{{ article | parse }}
は Markdown から翻訳された HTML です。
safe
{{ article | parse }}
は HTML ですが、Django は自動的に HTML タグをエスケープして出力します。Django は >
といった特殊な記号をそのまま解釈して文字にします。これではブラウザは HTML を解釈できません。
safe は Django の自動エスケープを除去する関数です。Markdown を使うときは
- Markdown フック
- safe フック
の 2 つを使うようにしよう。
メモ
templatetags には次のような関数が定義されています。
@register.filter
@stringfilter
def parse_markdown(value):
md = markdown.Markdown()
return md.convert(value)
templatetags は templates や static と同じ階層になるディレクトリで、テンプレートで呼び出すときは
{% load tags %}
を宣言してから使います。