mathpython

DjangoでMarkdownを使う時はsafe(autoescape)を使わないとタグが表示されない

Djangoの開発者がいつもストレスを抱えている原因は、こうしたちょっとしたテクニックが英語の文献に分散されているからだ。

Markdownを使う時はもちろんtemplatetagsで定義した関数を使うことになる。Markdownをviewで使うのもいいが、それはtemplatetagsというDjangoの強みをまったくいかしていないことになる。

結論

<div>{{ post.description|parse_markdown|safe }}</div>

post.descriptionはviewから受け取ったデータである。ここにはpタグもテーブルタグも入っていないMarkdown形式の文章が入っている。これをtemplatetagsで用意した自作関数(MarkdownをHTMLにする関数)にかけて、post.description|parse_markdownとする。縦棒一本で終わりだ。

この時点でMarkdownはHTMLになった。

しかしDjangoは内部に厳しいチェック機能を持っているので、タグをタグとして表示してくれない。そこでこの機能を一時的に除去するのが、最後のsafeである。

Markdownを使う時は

  • Markdownフック
  • safeフック

の2つを使うようにしよう。

古い記事では、safeを知らないがためにautoescapeを使うという説明があるが、開発画面でソースコードのインデントがすべて崩れてしまうというバグがあるので推奨されない。

公式ページではBuilt-in filter referenceというタイトルで、テンプレートで使用可能の強力なフィルターを用意している。これをうまく使うかで開発効率は変わるだろう。

Built-in filter reference

メモ

templatetagsには次のような関数が定義されている。

@register.filter
@stringfilter
def parse_markdown(value):
    md = markdown.Markdown()
    return md.convert(value)

templatetagsはtemplatesやstaticと同じ階層になるディレクトリで、テンプレートで呼び出すときは

{% load tags %}

を宣言してから使う。

広告

教育総合サイト

高校化学専門サイト

色辞典

数の辞典