我正在创建一个项目,允许用户单击以“#”和“ @”开头的单词,但我设法获得了一个主题标签,但是当我尝试同时实现二者时出现了问题>
我使用正则表达式操作返回值和mark_safe,因为它是html标记
在模板tag_files中,我这样做了
def create_hashtag_link(tag):
url = "/hash/?hash={}".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)))
def create_mention_link(mention):
link = "/mention/?user={}".format(mention)
return '<a href="{}">{}</a>'.format(link, mention)
@register.filter()
def mention_link(value):
return mark_safe(
re.sub(r"@(\w+)", lambda x: create_mention_link(x.group(0)),
escape(value)))
我在模板中做到了
{{ post.content|truncatewords:"19"|mention_link|hashtag_links }}
它输出以下内容:
#testing things out <a href="/mention/?user=lol">lol</a>
标签有效,但“ @”无效
答案 0 :(得分:1)
#testing things out <a href="/mention/?user=lol">lol</a>
这不正确吗?链接看起来像想要的结果吗?
除非按原样呈现以上内容
试试看
def create_hashtag_link(tag):
url = "/hash/?hash={}".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)),
value))
def create_mention_link(mention):
link = "/mention/?user={}".format(mention)
return '<a href="{}">{}</a>'.format(link, mention)
@register.filter()
def mention_link(value):
return mark_safe(
re.sub(r"@(\w+)", lambda x: create_mention_link(x.group(0)),
value))
基本上,escape
执行以下(source)
使用&符,引号和尖括号返回给定的文本 编码用于HTML。
我认为,一旦您应用了其中一个过滤器,由于您进行了escape(value)
的操作,那么您现在可以逃脱除替换部分以外的全部内容。当您应用第二个过滤器时,将重复此过程,您将替换某个零件,但未修改的部分现在已转义。我怀疑最终结果(如果您做了页面源代码)看起来像这样:
<a href="/hash/?hash=testing">#testing</a> things out <a href="/mention/?user=@lol">@lol</a>
所以#标签(因为最后应用)是可以的,但是链接实际上并未呈现为html。