Найти - Пользователи
Полная версия: Перенос строк TextField
Начало » Django » Перенос строк TextField
1
876974
Доброго времени.
Поскольку я ещё новичок в Python а так же в изучении Django.
Возникло несколько вопросов при разработке мелкого проекта.
Вопрос в следующем.
Имеется Модель с содержанием:
models.TextField()
А для поддержки различных html тегов вывод ее осуществляется через:
{{ post.text|safe }}

Но поскольку при написании нужного мне материала в данную модель осуществляется без каких либо дополнительных bb редакторов, в частности имеется ввиду такой как TinyMCE, то просматриваемый материал не сохраняет перенос строк осуществленный при написании, хотя в базе данных этот перенос успешно сохраняется \n.

Возможно ли каким либо образом осуществить перенос строк, не используя различных редакторов при написании, но и не меняя отображения используя {{ post.textlinebreaks }} дабы сохранить возможность использования html.
newca9h
Здравствуйте! Напишите шаблонный фильтр, который будет изменять символ переноса строки на тег <br /> например. Ссылка.

Можно написать вот так:

@register.filter(is_safe = True)
def replace_n(value):
    return value.replace('\n', '<br />')
inoks
не понятно, вы linebreaks используете или нет?
876974
inoks
не понятно, вы linebreaks используете или нет?
В том то и дело что хочу альтернативу ей. Но с возможностью использования html тегов в модели TextField.
Возможность есть с safe. но тут возникают сложности с переносом строк, без использования расставления br для переносе строки. Либо приходится прибегать к испольованияю TinyMCE либо ему подобных редакторов.
barabansheg
А что мешает сделать так: {{ post.text|safe|linebreaks }} ?
876974
barabansheg
А что мешает сделать так: {{ post.text|safe|linebreaks }} ?
Применив изначально в safe то текст преобразуется в html для которого linebreaks будет бесполезен. Так как перенос преобразованного текста будет в случае если в тексте содержится html тег br.
Проще говоря данный способ не работает.
newca9h
Вы мой способ попробовали? Поскольку в фильтре используется is_safe = True, то все теги будут корректно отображаться, а строки будут переноситься тегом <br />. Если вам не нравится использование <br /> вы можете например переписать фильтр следующим образом:

@register.filter(is_safe = True)
def replace_n(value):
    value = '<p>' + value + '</p>'
    return value.replace('\n', '</p><p>')

Таким образом, каждая новая строка будет закрывать предыдущий тег </p> начинаться с тега <p>. Вы можете заменить его на любой другой тег. А в шаблоне вызывать совместно с safe. Например: {{ post.text|safe|replace_n }}
inoks
а чем ваш тэг отличается от стандартного джанговского?
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#linebreaksbr
newca9h
Новый вариант отличается тем, что на каждую новую строку он добавляет новый параграф (<p></p>), вместо простого <br />. Это удобнее, так как новый абзац - новый <p> вместо простого переноса строки. Однако, приведенный мной новый вариант имеет один недостаток - если будет подряд несколько символов \n , то фильтр вставит несколько пустых блоков <p></p>. Поэтому, код лучше немного переписать. А первый вариант я написал для примера.
PyJohn
newca9h, доработал Ваш вариант, поскольку в разных операционных системах используются разные переносы строк.
Для той же Windows, к примеру, перевод строки состоит еще и из возврата каретки: \r\n.
Поэтому нужно быть готовым к разным сюрпризам, пусть и с парой лишний строк.
Единственное, что корректно это будет работать с одним подряд идущим переводом строки.

  
@register.filter(is_safe = True)
def linebreaksdiv(a):
    a = '<div>' + a + '</div>'
    a = a.replace('\r', '\n')
    a = a.replace('\n\n', '\n')
    a = a.replace('\n', '</div><div>')
    return a
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB