2009-07-21 3 views
1

Я испытываю то, что я считаю несколько странным поведением. В частности, если у меня есть строка, как это:Django Double Escaping Quotes и т. Д.

1984: Curriculum Unit
Дональд Р. Хог, Центр обучения, Джордж Оруэлл

«Центр для обучения издания» - обложка.

Это приводит к следующему после автоматического маскированные с помощью системы шаблонов Django:

1984: Curriculum Unit
Дональд Р. Хог, Центр обучения, Джордж Оруэлл

& Центр для изучения публикаций & quot; - Обложка.

Проблема, кажется, что "(цитата), который должен стать " в настоящее время бежал в два раза, в результате чего &". Это приводит странно смотря на форматирование. Я использую Django 1.0.2, так что должен быть обновлен (хотя я должен отметить, что я использую пакет Ubuntu 9.04 с пакетом python-django), но это поведение противоречит предполагаемому поведению.

Я немного искал django.utils.html .py, который включает в себя фактическую функцию:

def escape (HTML):

"" "Возвращает данный HTML с амперсандах, цитаты и CARETS закодированный". ""

return mark_safe(force_unicode(html).replace('&','&amp;').replace('<','&lt;').replace('>', '&gt;').replace('"', '&quot;').replace("'",'&#39;'))

побег = allow_lazy (побег, юникод)

В любом случае, похоже, что он должен избегать & прежде чем что-либо еще, что будет хорошо. Поэтому я подозреваю, что его зовут дважды. Есть предположения?

Спасибо.

Обновление: Я был подозрительным, что это может иметь какое-то отношение к Django Ubuntu, которое оно отображает как «1.0.2-1», поэтому я установил «1.0.2-final» и испытываю ту же проблему.

ответ

1

Вам не нужно думать об ускорении в 1.0. Если у вас есть шаблон

<html> 
<body> 
    & == &amp; in HTML 
</body> 
</html> 

Он должен кодировать & в &amp; перед печатью.

Если у вас есть переменная

<html> 
<body> 
    {{ msg }} 
</body> 
</html> 

и

def view(request) : 
    msg = "& == &amp; in HTML" 

если должны быть напечатаны таким же образом.

Единственный раз, когда вы хотите сделать кодировку самостоятельно, вам нужно вставить необработанный html. Как:

def view(request) : 
    msg = '<img src="http://example.com/pretty.jpg" />This picture is very pretty' 

и в шаблоне

<html> 
<body> 
    {{ msg|safe }} 
</body> 
</html> 
+0

Это поведение, которого я ожидал бы, но это не то, что я получаю. Например, вы сказали выше msg = "& == & в HTML" Я бы получил что-то вроде этого: "& & == & & amp; в HTML" То есть он выполняет эвакуацию один раз, затем выходит из & в беглом результате. Спасибо за быстрый ответ, хотя! – philipk

+0

Ну, я пробовал делать что-то подобное, и все получилось просто отлично. Тем не менее, моя проблема с моим фактическим кодом не связана. Я собираюсь немного совать. – philipk

1

О выносливы хар хар,

Глупый меня, Google настолько умный, что они уже убежали эти символы в XML я разборе. Разве вы не знали бы этого, час возиться только для того, чтобы понять, что Google снова переусердствовал!

P.S. В случае, если кто-либо еще сталкивается с подобной проблемой, я специально ссылаюсь на XML, возвращаемый при выполнении такого запроса: http://books.google.com/books/feeds/volumes?q=1984, данные уже сбежались за вас! Сказав это, это немного меня огорчает, потому что надевать сейф в мои шаблоны будет означать, что если я когда-нибудь получу данные из другого источника, которому я не доверяю так много ... Во всяком случае, спасибо за чтение!