换行在django中不能正常工作



当我尝试在我的网站上使用自定义过滤器和安全发布帖子时,我的换行符不工作
html:

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

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

@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',这样用户就可以看到链接。它是工作的,但当我输入换行,我没有看到我的html内的换行。我做错了什么?我在订购过滤器时有问题吗?

我不知道为什么要添加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只这样做,用<br>代替n,而不用在p标签中包装结果(因为您已经这样做了)。

如果您将文本定义为text='this is an#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>'

最新更新