機能追加中に少しはまったので,備忘録程度に一筆.
成り行き
以前一行の入力しかできなかった部分を,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>あいうえお<br> かきくけこ</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