换行符在 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>'
当我尝试在我的网站中使用自定义过滤器和保险箱进行发布时,我的换行符不起作用 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>'