Я не думаю, что это хорошая идея иметь HTML в TextField
.Во-первых, это затруднит редактирование (вам придется писать код для перевода назад, что будет сложнее, чем пересылка);во-вторых, тратится много времени на хранение большого количества HTML в базе данных;и, наконец, потом будет труднее исправлять ошибки (например, если Vimeo изменил свой формат URL).
У вас есть два варианта, которые я вижу:
1.Функция просмотра
Сделайте этот перевод в функции просмотра.Ваша функция просмотра будет иметь следующую строку:
context["commentText"] = process_markup(thePost.commentText)
Затем в файле шаблона вам нужно пометить поле как safe
, поскольку вы уже отфильтровали его:
{{ commentText|safe }}
2.Настраиваемый фильтр
Выполните этот перевод в пользовательском теге фильтра, например, в фильтре restructuredtext
в django.contrib.markup
.Это то, что рекомендуется sebpiq, и, вероятно, это лучший вариант.
from django.template.defaultfilters import stringfilter
import re
@stringfilter
def mymarkup(value):
return process_markup(value)
Затем в файле шаблона вам нужно вызвать ваш фильтр:
{{ commentText|mymarkup }}
В обоихВ этом случае вам нужно написать process_markup(value)
, который будет выглядеть примерно так:
import re
_TAGS = [
# First, escape anything that might be misinterpreted. Order is important.
(r'&', r'&'),
(r'<', r'<'),
(r'>', r'>'),
(r'"', r'"'),
(r"'", r'''),
# Simple tags
(r'\[b\]', r'<b>'),
(r'\[/b\]', r'</b>'),
# Complex tags with parameters
(r'\[vimeo +(\d+) *\]', r'<iframe src="http://player.vimeo.com/video/\g<1>"'
r' width="400" height="225" frameborder="0"></iframe>'),
]
def process_markup(value):
for pattern, repl in _TAGS:
value = re.sub(pattern, repl, value)
return value
Возможно, есть и лучшие способы написания этой функции, но вы поймете идею.