25

我有一个像这样的简单表格:

class RecordForm(Form):    
    notes = TextAreaField('Notes')

我将数据记录在三个段落中,如下所示:

para1

para2

para3

在模板中,我想以只读方式查看该记录的内容。(不可编辑的表格)

记录是这种情况下包含数据的模型:

<td>{{ record.notes }}</td>

-->

<td>para1 para2 para3</td>

我该怎么做才能显示多行?

4

3 回答 3

42

所有的空格,包括换行符,在 HTML 中都变成了一个空格。

您的选择,从最好到最差:

  1. 放在white-space: pre-wrap;包含元素上。这告诉 HTML 完全按照它在源代码中的显示方式显示所有空格,包括换行符。(您也可以使用<pre>标签,但这也会禁用自动换行,这可能是您不想要的。)
  2. 将纯文本视为 Markdown 并向其扔一个 Markdown 处理器——Markdown 所做的事情之一就是将段落包装在<p>.
  3. 在 Python 领域,执行.replace('\n', '<br>'). 但这会让你容易受到 XSS 的攻击,因为字符串中可能存在其他类似 HTML 的垃圾,修复它有点麻烦。
于 2013-09-06T18:35:21.187 回答
3

正如Martijn Pieters 所建议的(通过链接Flask 片段 28),也可以为它添加一个自定义过滤器。该链接已过时,因为不再提供Flask Snippets 。

因此,我将在此处提供来自网络存档的片段

nl2br 过滤器

由 Dan Jacob 于 2010-06-17 @ 05:03 发布并归档于模板技巧

这是一个 nl2br(<BR> 的换行符)过滤器,改编自 Jinja2 示例:

http://jinja.pocoo.org/2/documentation/api#custom-filters

import re

from jinja2 import evalcontextfilter, Markup, escape

_paragraph_re = re.compile(r'(?:\r\n|\r|\n){2,}')

app = Flask(__name__)

@app.template_filter()
@evalcontextfilter
def nl2br(eval_ctx, value):
    result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', '<br>\n') \
        for p in _paragraph_re.split(escape(value)))
    if eval_ctx.autoescape:
        result = Markup(result)
    return result

上面关于自定义过滤器的链接似乎也已经过时了。这是来自当前稳定版本 1.1 的类似链接:https ://flask.palletsprojects.com/en/1.1.x/templating/#registering-filters

我不太确定他为什么要使用如此复杂的结果计算。对我来说,以下代码有效,而且更简单。也许,如果您不使用autoescape(我不想禁用),上面的变体会更好?!无论如何,现在两种变体都可用:

# custom_template_filters.py

from flask import Blueprint
from jinja2 import evalcontextfilter, Markup, escape

blueprint = Blueprint('custom_template_filters', __name__)

@evalcontextfilter
@blueprint.app_template_filter()
def newline_to_br(context, value: str) -> str:
    result = "<br />".join(re.split(r'(?:\r\n|\r|\n){2,}', escape(value)))

    if context.autoescape:
        result = Markup(result)

    return result

值得一提的是,来自 Dan Jacob 的代码片段使用了 Python2,并且我通过 Blueprint 运行了模板过滤器。为了完整起见,我还使用工厂方法提供了app.py :

# app.py

from flask import Flask

def create_app() -> Flask:
    app = Flask(__name__)
    ...
    register_template_filters(flask_app=app)
    return app

def register_template_filters(flask_app: Flask) -> None:
    from . import custom_template_filters
    flask_app.register_blueprint(custom_template_filters.blueprint)
    return None

它或多或少是一个实现细节,您将如何使上下文过滤器工作。主要思想是在函数内部nlbrnewline_to_br本身。如果您让自定义过滤器正常工作,它可以在您的所有 Jinja 模板中使用,您可以像这样使用它:

{{ anystring | newline_to_br }}
于 2020-03-06T22:40:45.377 回答
1

我已根据此https://stackoverflow.com/a/60572523/12851576答案从文档中修改了 nl2br 过滤器:

import re
from jinja2 import evalcontextfilter
from markupsafe import Markup, escape


@evalcontextfilter
def nl2br(eval_ctx, value):
    """Converts newlines in text to HTML-tags"""
    result = "<br>".join(re.split(r'(?:\r\n|\r|\n)', escape(value)))

    if eval_ctx.autoescape:
        result = Markup(result)
    return result

这个对我有用。有什么缺点吗?

于 2020-04-23T12:42:27.083 回答