mark_safe не работи/все още избягва в simple_tag

Използвам Django 1.3 и имам simple_tag, който трябва да върна някакъв неекраниран HTML и без значение какво правя, той все още избягва моите & към и моите | до %7C.

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 с тагове за автоматично излизане. Без успех.


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› предложение, екранирането наистина е правилно удебелено. Така че опитах html += ‹b›Escaped?‹/b› | & - Тръбата работи перфектно, което всъщност е същината на моя проблем. Това обяснява ли нещо?   -  person scoopseven    schedule 27.07.2012
comment
Така че сте вмъкнали низа точно преди return и | & не е избягал?   -  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, той показва екраниран HTML. Прегледът на пълния изходен код в Chrome или Firefox показва точно неекранирания HTML. Благодаря, sergzach. - person scoopseven; 27.07.2012

Стара тема, но наскоро се сблъсках със същия проблем. Накарах го работещ Python 3.6. Присвоете стойността от обикновен таг на променлива txt и изведете txt с помощта на шаблонни тагове {{ и добавете безопасен филтър към txt.

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