Я поддерживаю вилка приложения Inline. Ричард связался со мной по поводу этой проблемы, и я смог отследить ее до BeautifulSoup, а не Django.
Проблема заключалась в том, что метод BeautifulSoup replaceWith()
использовался для замены встроенной разметки отображаемым шаблоном. Результат render_to_string()
- это, конечно, строка. Когда replaceWith()
получает строку, она превращается в NavigableString
. Поскольку BeautifulSoup ожидает, что NavigbleString
s будут строками, он предполагает, что они небезопасны, и экранирует любые символы HTML. В результате значение, возвращаемое функцией inlines()
в Inline, содержало группу >
и <
, а не <
и >
.
Я не заметил этой проблемы в Django 1.3. Когда я посмотрел, BeautifulSoup действительно возвращал экранированный HTML. Шаблонный фильтр |safe
в Django, должно быть, экранировал ранее экранированный HTML. В Django 1.4 он больше этого не делает. (И этого не должно быть!)
Мое исправление для этого - проанализировать входящее значение с BeautifulSoup и использовать BeautifulSoup, чтобы найти всю встроенную разметку, как и прежде. Вместо того, чтобы использовать метод replaceWith()
BeautifulSoup для замены встроенной разметки визуализированным встроенным шаблоном, я теперь просто использую простой старый Python str.replace()
. Мне немного неловко, превращая разобранный суп обратно в строку и затем заменяя ее. Но это работает. Отчасти я испытываю желание просто покончить с BeautifulSoup и найти встроенную разметку с регулярными выражениями, но мы все знаем, чем это заканчивается . Если у кого-то есть идея получше, я весь в ушах!
Исправление было изначально включено в этот коммит . Я улучшил его в следующем коммите, но, очевидно, StackOverflow позволяет мне публиковать максимум две ссылки, так что вам придется найти его самостоятельно!