2017-02-09 70 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