使用Templatetags使模板中的所有主题标签可单击

时间:2017-02-09 13:01:08

标签: python django django-templates

我想将comment文本字段中的每个主题标签转换为网址,以便它可以点击。

例如,用户提交,

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}来点击所有主题标签。

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

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

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您需要使用mark_safe将返回值标记为html。请注意,由于您将其标记为安全,因此您必须先escapere.sub()正是您所寻找的:

[Unit]
Description=Spark Worker
After=network.target
OnFailure=plab-service-alarm@.service

[Service]
Type=forking
ExecStart=/opt/sparkassandra/spark/sbin/start-slave.sh spark://the_master_IP:7077
ExecStop=/opt/sparkassandra/spark/sbin/stop-slave.sh
StandardOutput=journal
StandardError=journal
LimitNOFILE=infinity
LimitMEMLOCK=infinity
LimitNPROC=infinity
LimitAS=infinity
CPUAccounting=true
CPUShares=100
Restart=always

[Install]
WantedBy=multi-user.target

注意:我们假设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),不需要转义。要创建指向其他文本片段的链接,请使用format_html()代替\w+