Разрывы строк не работают должным образом в 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>'

Вернуться на верх