【问题标题】:How to check if text contains words starting with '#' in django?如何在django中检查文本是否包含以'#'开头的单词?
【发布时间】:2016-05-14 09:39:40
【问题描述】:

我正在尝试在我的博客应用程序上实现标签功能。

如何检查帖子的“文本”是否包含以“#”开头的单词,如果是,则将它们的 url 重定向到 /tags/~word~?

所以 f.e.用户可以写一篇文章“我今天去过#ny,很酷#yolo #summer”,因此它将创建#ny、#yolo、#summer 标签并使其成为重定向到/tags/ny/、/的url标签/yolo/,和/tags/summer/,

我学习 python 和 django 的时间只有一两个星期,可能有一些我不知道的功能 :)

【问题讨论】:

  • 您可能还想查看 'taggit' 包:django-taggit.readthedocs.io/en/latest
  • 对不起@obi,我要删除我的答案,因为这实际上是个坏主意,您不应该将原始 HTML 放在这样的字符串中(Django 甚至会尝试在您的模板中阻止您)。其他更了解 Django 的人将不得不回答。
  • 使用模板标签和正则表达式。
  • 确保首先清理文本(转义有潜在危险的字符)然后然后添加您的HTML。因为您需要使用mark_safe() 将其标记为安全,因此,它实际上应该是安全的。

标签: python regex django


【解决方案1】:

<a href="/tag/links">links</a> 替换#tags 是更容易的部分

>>> import re
>>> t = 'Some #cool text here #whatya think!'
>>> re.sub(r'#(\w+)', r'<a href="/tag/\1">\1</a>', t)
'Some <a href="/tag/cool">cool</a> text here <a href="/tag/whatya">whatya</a> think!'

更重要的是让它安全。

您可以使用模板标签,以便在模板中轻松调用它,例如 {% link_tags t %}。但是您需要在添加自己的 HTML 之前过滤或转义原始 HTML。不要在来自用户的未过滤字符串上使用mark_safe()!永远。

【讨论】:

  • 我创建了新过滤器:@register.filter(name='hash') def hash(text): return re.sub(r'#(\w+)', r'&lt;a href="/tags/\1"&gt;#\1&lt;/a&gt;', text) 并在模板中:{{ post.text|hash|linebreaks }} 问题是页面上的输出是原始 html 值,所以它看起来像 &lt;a href="/tags/xxx"&gt;#xxx&lt;/a&gt; 而不仅仅是 #xxx标签的链接。我可以在模板中添加|safe 标记,但这会让用户使用其他 html 代码。我该如何解决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 2016-12-05
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多