Уведомления

Группа в Telegram: @pythonsu

#1 Май 3, 2013 10:33:54

876974
От: Russia
Зарегистрирован: 2013-05-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Перенос строк TextField

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

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

Возможно ли каким либо образом осуществить перенос строк, не используя различных редакторов при написании, но и не меняя отображения используя {{ post.textlinebreaks }} дабы сохранить возможность использования html.

Офлайн

#2 Май 3, 2013 16:35:46

newca9h
Зарегистрирован: 2012-05-28
Сообщения: 46
Репутация: +  3  -
Профиль   Отправить e-mail  

Перенос строк TextField

Здравствуйте! Напишите шаблонный фильтр, который будет изменять символ переноса строки на тег <br /> например. Ссылка.

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

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

Отредактировано newca9h (Май 3, 2013 16:46:15)

Офлайн

#3 Май 4, 2013 14:32:28

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Перенос строк TextField

не понятно, вы linebreaks используете или нет?

Офлайн

#4 Май 4, 2013 15:22:26

876974
От: Russia
Зарегистрирован: 2013-05-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Перенос строк TextField

inoks
не понятно, вы linebreaks используете или нет?
В том то и дело что хочу альтернативу ей. Но с возможностью использования html тегов в модели TextField.
Возможность есть с safe. но тут возникают сложности с переносом строк, без использования расставления br для переносе строки. Либо приходится прибегать к испольованияю TinyMCE либо ему подобных редакторов.

Офлайн

#5 Май 8, 2013 07:22:26

barabansheg
От:
Зарегистрирован: 2011-10-16
Сообщения: 114
Репутация: +  2  -
Профиль   Отправить e-mail  

Перенос строк TextField

А что мешает сделать так: {{ post.text|safe|linebreaks }} ?



Fidonet. Nod 2:5034/10. Идет набор. Подробности в личку.
Мой блог

Отредактировано barabansheg (Май 8, 2013 07:22:33)

Офлайн

#6 Май 8, 2013 14:13:28

876974
От: Russia
Зарегистрирован: 2013-05-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Перенос строк TextField

barabansheg
А что мешает сделать так: {{ post.text|safe|linebreaks }} ?
Применив изначально в safe то текст преобразуется в html для которого linebreaks будет бесполезен. Так как перенос преобразованного текста будет в случае если в тексте содержится html тег br.
Проще говоря данный способ не работает.

Офлайн

#7 Май 9, 2013 16:19:02

newca9h
Зарегистрирован: 2012-05-28
Сообщения: 46
Репутация: +  3  -
Профиль   Отправить e-mail  

Перенос строк TextField

Вы мой способ попробовали? Поскольку в фильтре используется 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 }}

Отредактировано newca9h (Май 9, 2013 16:20:54)

Офлайн

#8 Май 10, 2013 00:11:18

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Перенос строк TextField

а чем ваш тэг отличается от стандартного джанговского?
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#linebreaksbr

Офлайн

#9 Май 10, 2013 11:19:51

newca9h
Зарегистрирован: 2012-05-28
Сообщения: 46
Репутация: +  3  -
Профиль   Отправить e-mail  

Перенос строк TextField

Новый вариант отличается тем, что на каждую новую строку он добавляет новый параграф (<p></p>), вместо простого <br />. Это удобнее, так как новый абзац - новый <p> вместо простого переноса строки. Однако, приведенный мной новый вариант имеет один недостаток - если будет подряд несколько символов \n , то фильтр вставит несколько пустых блоков <p></p>. Поэтому, код лучше немного переписать. А первый вариант я написал для примера.

Отредактировано newca9h (Май 10, 2013 11:43:16)

Офлайн

#10 Авг. 21, 2017 11:45:45

PyJohn
Зарегистрирован: 2017-08-20
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Перенос строк TextField

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version