使所有以“ @”和“#”开头的单词都可点击

时间:2019-05-09 02:05:05

标签: python django

我正在创建一个项目,允许用户单击以“#”和“ @”开头的单词,但我设法获得了一个主题标签,但是当我尝试同时实现二者时出现了问题

我使用正则表达式操作返回值和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>

标签有效,但“ @”无效

1 个答案:

答案 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 &lt;a href=&quot;/mention/?user=@lol&quot;&gt;@lol&lt;/a&gt;

所以#标签(因为最后应用)是可以的,但是链接实际上并未呈现为html。