Python 使用Templatetags使模板中的所有标签都可单击

Python 使用Templatetags使模板中的所有标签都可单击,python,django,django-templates,Python,Django,Django Templates,我想将注释文本字段中的每个标签都转换为url,以便可以单击 例如,用户提交 s = "I can't get enough of #SO because #developers are very #supportive" 我希望它在模板中像这样返回 I can't get enough of #SO because #developers are very #supportive 其中将显示整个文本,并且通过嵌入{hashtag}可以单击所有hashtag 我尝试了下面的templateta

我想将
注释
文本字段中的每个标签都转换为url,以便可以单击

例如,用户提交

s = "I can't get enough of #SO because #developers are very #supportive"
我希望它在模板中像这样返回

I can't get enough of #SO because #developers are very #supportive
其中将显示整个文本,并且通过嵌入{hashtag}可以单击所有hashtag

我尝试了下面的templatetags代码,但它不会返回带有文本的hashtags。只会退回这个,

<a href='http://example.com/tags/SO'>SO</a> 
我缺少什么?

您需要使用将返回值标记为html。请记住,既然您将其标记为安全的,那么必须首先将其标记为安全的。这就是你想要的:

import re
from django import template
from django.utils.html import escape
from django.utils.safestring import mark_safe

register = template.Library()

def create_hashtag_link(tag):
    url = "/tags/{}/".format(tag)
    # or: url = reverse("hashtag", args=(tag,))
    return '<a href="{}">#{}</a>'.format(url, tag)


@register.filter()
def hashtag_links(value):
    return mark_safe(
        re.sub(r"#(\w+)", lambda m: create_hashtag_link(m.group(1)),
               escape(value)))
重新导入
从django导入模板
从django.utils.html导入转义
从django.utils.safestring导入标记_safe
register=template.Library()
def创建标签链接(标签):
url=“/tags/{}/”。格式(tag)
#或者:url=reverse(“hashtag”,args=(tag,))
返回“”。格式(url、标记)
@register.filter()
def标签链接(值):
安全返回标记(
re.sub(r“#”(\w+),lambda m:创建标签链接(m.group(1)),
转义(值)

注意:我们假设
value
是文本(未转义),而
create\u hashtag\u link(tag)
假设
tag
是一个单词(
\w+
),不需要转义。要创建指向其他文本片段的链接,请使用而不是
.format()

可能有一些JS库可以这样做。你能为我推荐一个库吗?JS中的一些正则表达式也可以这样做:我建议使用
条件_escape
而不是
escape
来避免双重转义hanks Udi。你太棒了@DanielHepper:如果它已经是html,那么像
这样的东西可能已经存在,并且需要解析输入值。让我们保持输入值文本和解决方案的简单。。。
{{object.comment|safe|hashchange}}
import re
from django import template
from django.utils.html import escape
from django.utils.safestring import mark_safe

register = template.Library()

def create_hashtag_link(tag):
    url = "/tags/{}/".format(tag)
    # or: url = reverse("hashtag", args=(tag,))
    return '<a href="{}">#{}</a>'.format(url, tag)


@register.filter()
def hashtag_links(value):
    return mark_safe(
        re.sub(r"#(\w+)", lambda m: create_hashtag_link(m.group(1)),
               escape(value)))