【问题标题】:Generate same text with and without HTML tags?生成带有和不带有 HTML 标签的相同文本?
【发布时间】: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吗?)

标签: python django


【解决方案1】:

我认为一种方法是:

  1. 在模板中写入一次,生成两次 HTML 文本
  2. 处理上述两个 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 %}

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

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 2013-02-22
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多