Разрывы строк не работают должным образом в djagno
Мои переносы строк не работают, когда я пытаюсь использовать пользовательский фильтр и сейф на моем сайте для публикации сообщения.
html:
<p>{{ text|striptags|linebreaks|mention|safe }}</p>
mention - мой пользовательский фильтр, а мои templatetags:
@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', чтобы пользователь мог видеть ссылку. Это работает, но когда я набираю linebreaks, я не вижу linebreaks внутри моего html. Что я делаю не так? У меня проблема в заказе фильтра?
Я не совсем понимаю, зачем вы хотите добавить фильтр linebreaks
. Не могли бы вы привести пример, чтобы я мог отредактировать этот ответ?
Фильтры Django - это простые функции, которые можно тестировать непосредственно из shell
.
Вам не нужно добавлять фильтр safe
после mention
, потому что вы уже зарегистрировали фильтр как безопасный (что правильно).
Возможно, вы хотите добавить разрывы строк в конец цепочки фильтров, но затем в вашем пользовательском фильтре вы должны разделить и сохранить разделитель.
<@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[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>'