как отобразить выходной текст из БД только в одной строке в шаблонах django

#html #django #django-templates #django-template-filters

#HTML #django #django-шаблоны #django-template-filters

Вопрос:

В моем проекте Django я хочу прочитать некоторый текст из моей базы данных PostgreSQL и показать их так же, как электронные письма, которые отображаются в папке Входящие. т.е. Каждый вывод не должен содержать разрывов строк (вводов) или других тегов.

введите описание изображения здесь

До сих пор я писал что-то подобное:

 <div>
     <p style="font-size: 15px;">{{ contact.message |safe|truncatewords:15|cut:"n" }}</p>
</div>
 

Я также тестировал |striptags tag вместо |cut:"n" . Он удаляет разрывы строк, но с этим возникают некоторые другие проблемы, поскольку я использую CKEditor richtextfield, а текст имеет некоторые пометки.

как отобразить всего 1 строку текста (до нескольких слов, например, 15) без каких-либо разрывов строк и HTML-тегов?

любая помощь приветствуется.

Комментарии:

1. В моем конкретном случае я использую richtext с изображениями в нем. Я создал свой собственный пользовательский тег шаблона с набором регулярных выражений и операторов if / else, чтобы позаботиться о нескольких конкретных случаях (изображение в начале текста и т. Д.)

2. пожалуйста, приведите какой-нибудь пример. как создать пользовательский тег для удаления разрывов строк

3. поместите пример кода в качестве ответа с подробным шагом для создания пользовательских тегов

Ответ №1:

Я сделал аналогичную вещь для ckeditor, сгенерированного html-текста, используя пользовательский тег шаблона. Я переписал его для ваших целей, но не тестировал его.

  1. Создайте templatetags папку в одном из приложений, которое указано в INSTALLED_APPS в файле настроек проекта. Я поместил свой в свою custom_utilities папку, в которой размещены все пользовательские утилиты
  2. Создайте пустой __init__.py файл внутри templatetags папки
  3. Создайте custom_tags.py файл внутри templatetags папки.
  4. Внутри custom_tags.py создайте removelinebreaks функцию
 from django import template

from django.template.defaultfilters import stringfilter
import re
from django.utils.text import Truncator

register = template.Library()

# register filter
# is_safe is for telling Django that if a “safe” string is passed into your filter, the result will still be “safe” and if a non-safe string is passed in, Django will automatically escape it, if necessary.
@register.filter(is_safe=True)
# only accepts string as the first argument.
@stringfilter                 
def removelinebreaks(text, num):

    print('original text-----')
    print(text)

    # case insensitive matching of 'amp;nbsp;' non-breaking space
    text= re.sub('amp;nbsp;', '', text, flags=re.IGNORECASE) 
    #remove space, tabs, and newlines zero or more times
    text= re.sub("<p>s*</p>","", text, flags=re.MULTILINE) 
    # remove <br> tag.
    text= re.sub("<br>","", text)

    print('replaced text-----')
    print(text)

    # truncate the text
    return Truncator(text).chars(num)   '...'

 
  1. В вашем шаблоне,
 {% load custom_tags %}

{{forumpost.mytext|removelinebreaks:15|safe}}
 
  1. Также убедитесь, что вы перезапустили сервер разработки Django. Если сервер не перезапускается, Django не будет регистрировать теги.

Комментарии:

1. просто понял, что в моем custom_tags.py , Я пропустил from django import template и register = template.Library() добавил только сейчас.