Форум сайта python.su
Доброго времени.
Поскольку я ещё новичок в Python а так же в изучении Django.
Возникло несколько вопросов при разработке мелкого проекта.
Вопрос в следующем.
Имеется Модель с содержанием:
models.TextField()
А для поддержки различных html тегов вывод ее осуществляется через:
{{ post.text|safe }}
Но поскольку при написании нужного мне материала в данную модель осуществляется без каких либо дополнительных bb редакторов, в частности имеется ввиду такой как TinyMCE, то просматриваемый материал не сохраняет перенос строк осуществленный при написании, хотя в базе данных этот перенос успешно сохраняется \n.
Возможно ли каким либо образом осуществить перенос строк, не используя различных редакторов при написании, но и не меняя отображения используя {{ post.textlinebreaks }} дабы сохранить возможность использования html.
Офлайн
Здравствуйте! Напишите шаблонный фильтр, который будет изменять символ переноса строки на тег <br /> например. Ссылка.
Можно написать вот так:
@register.filter(is_safe = True) def replace_n(value): return value.replace('\n', '<br />')
Отредактировано newca9h (Май 3, 2013 16:46:15)
Офлайн
не понятно, вы linebreaks используете или нет?
Офлайн
inoksВ том то и дело что хочу альтернативу ей. Но с возможностью использования html тегов в модели TextField.
не понятно, вы linebreaks используете или нет?
Офлайн
А что мешает сделать так: {{ post.text|safe|linebreaks }} ?
Отредактировано barabansheg (Май 8, 2013 07:22:33)
Офлайн
barabanshegПрименив изначально в safe то текст преобразуется в html для которого linebreaks будет бесполезен. Так как перенос преобразованного текста будет в случае если в тексте содержится html тег br.
А что мешает сделать так: {{ post.text|safe|linebreaks }} ?
Офлайн
Вы мой способ попробовали? Поскольку в фильтре используется is_safe = True, то все теги будут корректно отображаться, а строки будут переноситься тегом <br />. Если вам не нравится использование <br /> вы можете например переписать фильтр следующим образом:
@register.filter(is_safe = True) def replace_n(value): value = '<p>' + value + '</p>' return value.replace('\n', '</p><p>')
Отредактировано newca9h (Май 9, 2013 16:20:54)
Офлайн
а чем ваш тэг отличается от стандартного джанговского?
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#linebreaksbr
Офлайн
Новый вариант отличается тем, что на каждую новую строку он добавляет новый параграф (<p></p>), вместо простого <br />. Это удобнее, так как новый абзац - новый <p> вместо простого переноса строки. Однако, приведенный мной новый вариант имеет один недостаток - если будет подряд несколько символов \n , то фильтр вставит несколько пустых блоков <p></p>. Поэтому, код лучше немного переписать. А первый вариант я написал для примера.
Отредактировано newca9h (Май 10, 2013 11:43:16)
Офлайн
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
Отредактировано PyJohn (Авг. 21, 2017 11:53:32)
Офлайн