换行符在 Django 中无法正常工作

linebreaks not working properly in django

当我尝试在我的网站中使用自定义过滤器和保险箱进行发布时,我的换行符不起作用 post。
html:

  <p>{{ text|striptags|linebreaks|mention|safe }}</p>

提到的是我的自定义过滤器,我的模板标签是:

@register.filter(name='mention',is_safe=True)
@stringfilter
def mention(value):
 res = ""

 for i in value.split():
    if i[0] == '#':
        if len(i[1:]) > 1:
            i = f'<a href="/recommendation/?q=%23{i[1:]}&submit=Search">{i}</a>'


    res = res + i + ' '
return res

最后我使用 'safe' 这样用户可以看到 link.it 正在工作但是当我输入换行符时我没有在我的 html.What 中看到换行符我是做错了吗?我在订购过滤器时有问题吗?

我不确定你为什么要添加 linebreaks 过滤器。你能举个例子让我编辑这个答案吗?

Django 过滤器是您可以直接从 shell.

测试的简单函数

您不需要在 mention 之后添加 safe 过滤器,因为您已经将过滤器注册为安全过滤器(这是正确的)。

也许您想在过滤器链的末尾添加换行符,但是在您的自定义过滤器中,您应该拆分并保留分隔符。

可能是这样的:

@register.filter(name='mention',is_safe=True)
@stringfilter
def mention(value):
  res = ''
  parts = re.split('(\s)', value)
  for i, elem in enumerate(parts[::2]):
      if elem and elem[0] == '#' and len(elem) > 2:
          elem = f'<a href="/recommendation/?q=%23{elem[1:]}&submit=Search">{elem}</a>'
      res += elem
      sep_index = i * 2 + 1
      if sep_index < len(parts):
          res += parts[sep_index]
return res

如果在re.split中指定了捕获组,那么分隔符也被返回(这里很方便)。

并在您的模板中:

<p>{{ text|striptags|mention|linebreaksbr }}</p>

linebreaksbr 只这样做,将 \n 替换为 <br>,而不将结果包装在 p 标记中(因为您已经这样做了)。

如果将文本定义为 text='this is a\n#django \n#test'

linebreaksbr(mention(striptags(text)))

被调用,你得到了

'this is a<br><a href="/recommendation/?q=%23django&submit=Search">#django</a> <br><a href="/recommendation/?q=%23test&submit=Search">#test</a>'