mark_safe не работает/все еще экранируется в simple_tag

Я использую Django 1.3, и у меня есть simple_tag, который мне нужен для возврата некоторого неэкранированного HTML, и независимо от того, что я делаю, он все еще ускользает от моего & to и моего | до %7С.

from django import template
from django.template import loader, Context
from django.utils.safestring import mark_safe

register = template.Library()

@register.simple_tag()
def show_stuff(arg1=None, arg2=None, arg3='someconstant'):

    # Do some stuff

    if someconstant == 'somevalue':
        template_name = 'template1.html'
    else:
        template_name = 'template2.html'

    template = loader.get_template(template_name)
    html = template.render(Context( {'myvar': myvar,} ))
    html = mark_safe(html)
    print type(html)
    return html

Заявление о печати показывает

<class 'django.utils.safestring.SafeUnicode'>

который, насколько я понимаю, не должен быть сбежавшим. Я вызываю тег в своем шаблоне так:

{% show_stuff 'arg1' 'arg2' 'arg3' %}

Помощь будет принята с благодарностью.

Обновление: попробовал следующее из комментариев ниже. Не вернул ошибку, но все еще экранирует HTML:

    ...
    template = loader.get_template(template_name)
    html = template.render(Context( {'myvar': myvar,} ))
    html = mark_safe(html)
    print type(html)
    return html
show_stuff().is_safe=True

Также попытался обернуть содержимое template1.html и template2.html в

{% autoescape off %}
template html contents with & and |
{% endautoescape %}

и обертывание самого вызова templatetag тегами autoescape. Нет успеха.


person scoopseven    schedule 26.07.2012    source источник
comment
А @register.simple_tag( is_safe = True ) тоже не работает?   -  person sergzach    schedule 26.07.2012
comment
simple_tag() получил неожиданный аргумент ключевого слова «is_safe»:/   -  person scoopseven    schedule 26.07.2012
comment
Хорошо, а что, если вы напишете свой тег как: {% show_stuff|safe 'arg1' 'arg2' 'arg3' %} (удалить is_safe = True)?   -  person sergzach    schedule 26.07.2012
comment
Пробовал и так... может синтаксис неверный. Возвращает недопустимый тег блока: 'show_stuff|safe', ожидаемый 'endblock' или 'endblock'   -  person scoopseven    schedule 26.07.2012
comment
ОК, удалите это. Попробуйте добавить строку в свой html перед возвратом: html += ‹b›Escaped?‹/b›. "Сбежал" жирным шрифтом?   -  person sergzach    schedule 26.07.2012
comment
'show_stuff().is_safe=True' — это ошибка. Должно быть 'show_stuff.is_safe=True'   -  person sergzach    schedule 26.07.2012
comment
Исправлен синтаксис show_stuff.is_safe, экранирование все еще происходит, НО, используя ваше предложение html += ‹b›Escaped?‹/b›, escaped действительно правильно выделен жирным шрифтом. Итак, я попробовал html += ‹b›Escaped?‹/b› | & - Труба работает отлично, в чем собственно и заключается моя проблема. Это что-нибудь объясняет?   -  person scoopseven    schedule 27.07.2012
comment
Итак, вы вставили строку непосредственно перед возвратом и | & не сбежал?   -  person sergzach    schedule 27.07.2012
comment
давайте продолжим это обсуждение в чате   -  person sergzach    schedule 27.07.2012
comment
Слишком много строк для обсуждения, давайте перейдем к чату: chat.stackoverflow.com/rooms/ 14483/   -  person sergzach    schedule 27.07.2012


Ответы (2)


Обсуждая с автором вопроса, мы обнаружили, что на самом деле символы не экранировались. Scoopseven (автор) просмотрел исходный html с опцией «Показать исходный код» контекстного меню в Firefox. В этом случае отображаются экранированные символы.

person sergzach    schedule 26.07.2012
comment
При использовании Firefox Show Selection Source он отображал экранированный HTML. Просмотр полного исходного кода в Chrome или Firefox точно отображал неэкранированный HTML. Спасибо, сергзач. - person scoopseven; 27.07.2012

Старая тема, но недавно я столкнулся с той же проблемой. У меня работает питон 3.6. Присвойте значение из простого тега переменной txt и выведите txt, используя теги шаблона {{, и добавьте безопасный фильтр в txt.

{% get_contentvalue user "htmlabout" as txt %}
{{txt|safe}}
person manit    schedule 08.01.2020