生成带有和不带有 HTML 标签的相同文本?

Posted

技术标签:

【中文标题】生成带有和不带有 HTML 标签的相同文本?【英文标题】:Generate same text with and without HTML tags? 【发布时间】:2017-10-24 17:01:46 【问题描述】:

我在 Django 1.9 中工作。我想在模板中生成几个句子,以便在应用程序的前端和元描述标签中使用。

在模板中,我希望它包含链接:

<p><a href=" object.get_absolute_url"> object.name </a> blah blah...</p>

但在元描述中,我显然不想包含那些链接——我只需要它是纯文本(但内容相同):

% block page_description % object.name </a> blah blah% endblock page_description %

理想情况下,我会使用模板标签在模板的两个位置包含相同的句子,但是如何以 DRY 的方式生成一个没有链接的版本和一个有链接的版本?

【问题讨论】:

你能在你的视图中检查这个吗?如果您有一个 HttpRequest 那么您知道它在网站上,那么您可以返回 html,否则返回非 HTML 文本? (或者前端还用HttpRequest吗?) 【参考方案1】:

我认为一种方法是:

    在模板中写入一次,生成两次 HTML 文本 处理上述两个 HTML 文本之一以删除标签

对于第一部分,我建议你看看How to repeat a "block" in a django template。

然后,您可以创建两个模板标签 % striphtml %% endstriphtml % 将其间的所有内容转换为纯文本:

import lxml.html

def do_striphtml(parser, token):
    nodelist = parser.parse(('endstriphtml',))
    parser.delete_first_token()
    return StripHtmlNode(nodelist)

class StripHtmlNode(template.Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist
    def render(self, context):
        html = self.nodelist.render(context)
        doc = lxml.html.document_fromstring(html)
        return doc.text_content()

这个灵感来自 Django 文档的“Parsing until another block tag, and saving contents”,并使用lxml.html 删除 HTML 标签。

将所有内容放在一起,模板应如下所示:

# base.html
<html>
    <head>
        ...
        <meta name="description" content="% striphtml %% block description %Meta description% endblock %% endstriphtml %">
    </head>
    <body>
        % block content %% endblock %
    </body>
</html>

然后:

# the_page.html
% extends 'base.html' %
% block content %
    % block description %
        <p>Content that will appear in the body (with tags) and in the meta description (without tags).</p>
    % endblock %
    Content not to be included in the meta tag.
% endblock %

这一切都未经测试,所以让我们知道它是否有效!

【讨论】:

以上是关于生成带有和不带有 HTML 标签的相同文本?的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2用于带有两个相同刻度标签的条形图

带有文本字段的多个复选框

不解释带有文本和变量的嵌套标签

自动单击包含相同文本和标签的页面上的多个按钮

将值放入具有相同值的数组中

Emmet语法