在CommonM中使用Django的urlize

2024-05-16 05:16:25 发布

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

我想使用Django的urlize函数和django-markwhatCommonMark过滤器。在

我在想象这样的事情:

{{ "http://example.com"|urlize|commonmark }}

输出<p><a href="http://example.com">http://example.com</a></p>。这里的问题是,已经在commonmark中标记的url,比如<http://example.com>,将在它们周围用尖括号呈现。在

如果我在commonmark之后应用urlize,如下所示:

^{pr2}$

urlize函数不检测<p>http://example.com</p>中的url(并且在urlize文档中提到,对于html输入,它将无法正常工作)。在

我还没有想出一个解决办法,所以如果你有什么想法请告诉我。在


Tags: django函数comhttpurl过滤器example事情
1条回答
网友
1楼 · 发布于 2024-05-16 05:16:25

为了完整起见,简单的答案是切换到Markdown解析器,该解析器提供您想要的行为。存在多个extensions,它们为Python Markdown提供了所需的行为。在

但是,如果您希望CommonMark具有这种行为,而CommonMark本身不支持这种行为,那么您需要创建一个在HTML上运行的自定义urlize过滤器。幸运的是,漂白剂库提供了一个linkify函数,可以正确地处理这个问题。在

当然,您还需要创建一个模板过滤器来包装:

from django import template
import bleach
from html5lib.tokenizer import HTMLTokenizer

register = template.Library()

@register.filter(is_safe=True)
def linkify(value):
    return bleach.linkify(value, skip_pre=True, parse_email=True, tokenizer=HTMLTokenizer)

请注意,我假设您确实希望解析电子邮件地址和url,您不希望解析代码块中的url,也不希望对CommonMark的输出进行清理。请随时查看漂白剂的文件并进行相应调整。在

要使用自定义过滤器,请将上述代码保存到应用程序中templatetags目录中名为linkify.py的文件(完整解释请参见Djangodocs)。然后在模板中执行以下操作:

^{pr2}$

相关问题 更多 >