#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-текста, используя пользовательский тег шаблона. Я переписал его для ваших целей, но не тестировал его.
- Создайте
templatetags
папку в одном из приложений, которое указано в INSTALLED_APPS в файле настроек проекта. Я поместил свой в своюcustom_utilities
папку, в которой размещены все пользовательские утилиты - Создайте пустой
__init__.py
файл внутриtemplatetags
папки - Создайте
custom_tags.py
файл внутриtemplatetags
папки. - Внутри
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) '...'
- В вашем шаблоне,
{% load custom_tags %}
{{forumpost.mytext|removelinebreaks:15|safe}}
- Также убедитесь, что вы перезапустили сервер разработки Django. Если сервер не перезапускается, Django не будет регистрировать теги.
Комментарии:
1. просто понял, что в моем custom_tags.py , Я пропустил
from django import template
иregister = template.Library()
добавил только сейчас.