8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

改行コードを改行タグに変換する方法

Posted at

機能追加中に少しはまったので,備忘録程度に一筆.

成り行き

以前一行の入力しかできなかった部分を,textareaに変えて複数行で入力できるようにしました.
これに伴って,内容の確認画面も複数行で表示できるようにしないといけなくなったのですが,
当然html側では改行コードがきても改行してくれません.
そこで改行コード(\r)を改行タグ(<br>)に直す必要がでてきました.

やったこと

とりあえず文字の変換さえできれば何とかなるだろうと思い,公式を参考にフィルターを作って使ってみました.

@app.template_filter('cr')
def cr(arg):
    return arg.replace('\r', '<br>')
{% for task in tasks %}
<table>
    <th>detail</th>
    <tr><td>{{ task[3] | cr }}</tr></td>
</table>
{% endfor %}

これで文字列中の改行コードが改行タグに変換されているはずとページを開いてみると

detail
あいうえお<br> かきくけこ

という感じになってました.
確かに変換はされていましたが,そのまま<br>と表示されてしまいました...

何でだろうと思ってソース覗いてみると

<table>
    <th>detail</th>
    <tr><td>あいうえお&lt;br&gt; かきくけこ</td></tr>
</table>

この有様です.
特殊文字がエスケープされてしまって,タグとして扱われていませんでした.

調べていくとこちらによさそうなことが書いてありました.
やはり特殊文字は何もしないでおくと,勝手にエスケープされてしまうようなので,
Markupクラスを使うか,safeフィルターをかける必要があるということでした.
ということで書き直しました.

from flask import Markup
# 略

@app.template_filter('cr')
def cr(arg):
    return Markup(arg.replace('\r', '<br>'))

htmlは先に書いたコードのままです.
すでにフィルターをかけていて,その上にさらにフィルターをかけられるかわからなかったので,今回はMarkupを使いました.

これで改めてページを開くとちゃんと改行されてました.無事解決です.

結論

タグに含まれる特殊文字が文字列中に含まれていると,自動でエスケープされてしまう.
そのため,タグとして扱ってほしければMarkupクラスを用いるか,safeフィルターをかけてエスケープされないようにする.

最後に改めて参考にさせていただいたページを載せておきます.
http://flask.pocoo.org/docs/1.0/templating/#registering-filters
https://qiita.com/Prismo/items/7bfd6cd3b4b651b6094f

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?