生成带有和不带有 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 标签的相同文本?的主要内容,如果未能解决你的问题,请参考以下文章