生成带或不带HTML标记的相同文本?

2024-04-19 17:25:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django 1.9工作。我想在一个模板中生成几个句子,用于应用程序的前端和meta description标签。你知道吗

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

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

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

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

理想情况下,我会使用一个模板标签在模板的两个地方包含相同的句子,但是我如何生成一个没有链接的版本和一个有链接的版本,以一种枯燥的方式?你知道吗


Tags: djangoname版本模板应用程序getobject链接
1条回答
网友
1楼 · 发布于 2024-04-19 17:25:21

我认为一种方法是:

  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 %}

这都是未经测试,所以让我们知道,如果它的工作!你知道吗

相关问题 更多 >