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