【问题标题】:linebreaks not working properly in django换行符在 django 中无法正常工作
【发布时间】:2021-11-07 23:33:10
【问题描述】:

当我尝试在我的网站中使用自定义过滤器和安全来发布帖子时,我的换行符不起作用。
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

最后我使用“安全”,以便用户可以看到链接。它正在工作,但是当我输入换行符时,我没有在我的 html 中看到换行符。我做错了什么?我在订购过滤器时遇到问题吗?

【问题讨论】:

  • 提供有问题的样本text

标签: django django-models django-views django-forms django-templates


【解决方案1】:

我不确定您为什么要添加 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 只这样做,用&lt;br&gt; 替换\n,而不将结果包装在p 标记中(反正你已经这样做了)。

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

linebreaksbr(mention(striptags(text)))

被调用,你得到了

'this is a&lt;br&gt;&lt;a href="/recommendation/?q=%23django&amp;submit=Search"&gt;#django&lt;/a&gt; &lt;br&gt;&lt;a href="/recommendation/?q=%23test&amp;submit=Search"&gt;#test&lt;/a&gt;'

【讨论】:

  • 我无法测试它,因为我在“if elem[0] == '#' and len(elem) > 2”中收到错误“字符串索引超出范围”跨度>
  • 当我尝试类似“这是布鲁塞尔\n#iloveyoubruxelles”时写的过滤器然后我得到“这是布鲁塞尔#iloveyoubruxelles" 我没有收到新行,因为我在我的网站的表单帖子中写道。我尝试了一切。
  • 我在最后使用 safe 以便用户可以看到链接而不是 html 。就像 twitter 对哈希标签所做的那样。
  • 也许问题出在“striptags”上?
  • safe 用于告诉模板引擎不需要转义 html 序列,因为该字符串是 html 安全的。如果没有safe,django 模板引擎将转义一些序列,如&amp;lt;&amp;gt;&amp;lt;&amp;gt;。因此,如果您不使用安全,则 html 将被转义,您将看到 html 为文本。 striptags 将简单地删除任何以&amp;lt; 开头的字符串,一个标签并以/&gt;&lt;/TAG_NAME&gt; 结尾。
猜你喜欢
  • 1970-01-01
  • 2020-10-08
  • 2023-02-16
  • 2014-01-02
  • 2016-01-18
  • 2013-10-21
  • 2014-03-07
  • 2013-02-25
  • 2015-01-06
相关资源
最近更新 更多