2017-02-09 69 views
1

我想将comment文本字段中的每个hashtag都转换为url,以便它可以点击。使模板中的所有hashtags可点击模板标签

例如,用户提交,

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 

当整个文本将显示所有主题标签可点击嵌入{#标签}。

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

<a href='http://example.com/tags/SO'>SO</a> 

app_extras.py

import re 

register = template.Library() 

@register.filter(name='hashchange') 
def hashchange(value): 
    vx=re.findall(r"#(\w+)", value) 
    for n in vx: 
     pm="<a href='http://example.com/tags/{0}'>{0}</a>".format(n) 
     return pm 

在模板中,我所做的,

{{object.comment|safe|hashchange}} 

我缺少什么?

+0

可能有一些JS库意味着要执行此操作。 –

+0

可以为我推荐一个图书馆吗? – YoYo

+0

在JS中的一些正则表达式也可以这样做:http://stackoverflow.com/questions/13655333/how-do-i-use-javascript-to-replace-hash-tags-with-links-from-a-jquery-data -attri –

回答

2

您将需要使用mark_safe将您的返回值标记为html。请记住,由于您将其标记为安全,您必须首先使用escapere.sub()就是你要找的人:

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))) 

注:我们假设value是文本(转义),并create_hashtag_link(tag)假定tag是一个字(\w+),不需要逃跑。若要创建其他文本片段的链接,请使用format_html()而不是.format()

+0

我建议使用'conditional_escape'而不是'escape'来避免双转义 –

+0

感谢Udi。你摇滚! – YoYo