Python 使所有单词都以“开始”@&引用;及#&引用;可点击

Python 使所有单词都以“开始”@&引用;及#&引用;可点击,python,django,Python,Django,我正在创建一个项目,允许用户单击以“#”和“@”开头的单词。我成功地使hashtag的单词工作,但当我试图同时实现这两个单词时,出现了一个问题 我使用正则表达式操作返回值并将其标记为安全,因为它是一个html标记 在模板标记文件中,我这样做了 def create_hashtag_link(tag): url = "/hash/?hash={}".format(tag) # or: url = reverse("hashtag", args=(tag,)) return

我正在创建一个项目,允许用户单击以“#”和“@”开头的单词。我成功地使hashtag的单词工作,但当我试图同时实现这两个单词时,出现了一个问题

我使用正则表达式操作返回值并将其标记为安全,因为它是一个html标记

在模板标记文件中,我这样做了

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>
#测试东西
hashtag有效,但“@”无效

#测试东西

这不对吗?链接看起来像期望的结果

除非它是按字面意思呈现上述内容



试试这个

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))
def创建标签链接(标签):
url=“/hash/?hash={}”。格式(标记)
#或者:url=reverse(“hashtag”,args=(tag,))
返回“”。格式(url、标记)
@register.filter()
def标签链接(值):
安全返回标记(
re.sub(r“#”(\w+),lambda m:创建标签链接(m.group(1)),
(价值)
def创建_提及_链接(提及):
link=“/TINCE/?user={}”。格式(TINCE)
返回“”。格式(链接,提及)
@register.filter()
def提及链接(值):
安全返回标记(
re.sub(r“@(\w+),lambda x:创建链接(x.group(0)),
(价值)
基本上,
escape
执行以下操作()

返回带有符号、引号和尖括号的给定文本 为在HTML中使用而编码

我认为,一旦您应用了其中一个过滤器,由于您执行了
escape(value)
操作,现在您已经对整个内容进行了转义,除了替换的部分。当您应用第二个过滤器时,此过程将重复,您将替换某些零件,但现在将转义未触及的部分。我怀疑最终结果(如果您使用了页面源代码)如下所示:

things out a href=“/nity/?user=@lol”@lol/a


因此,hashtag(因为它是最后应用的)是可以的,但是链接实际上没有呈现为html。

您的输入是什么(
post.content
)?@Selcuk我不确定您的意思,post.content是一个包含post content的字段该变量的内容是什么?你能举个例子吗?它似乎没有把
#testing
转换成一个链接。啊,好吧,被>hashtag工作弄糊涂了,但是“@”并没有表现出来#逐字逐句地测试,而“安全”过滤器并不是working@Akindele好的,在这种情况下,请尝试删除
escape
函数调用。该调用正常,谢谢,你能解释一下你是怎么知道它是逃逸功能的吗?