Подтвердить что ты не робот

Выброс шаблона Django

Система шаблонов Django предоставляет несколько опций (фильтров) для экранирования содержимого в html, но они немного запутывают меня как новичка. Скажем, я следую учебному пособию, чтобы создать простой блог, а содержание блога должно быть экранировано - я доверяю содержимому, потому что я единственный, кто его редактирует. Итак, вопрос в том, должен ли я сделать это как {{ post.content|autoescape }}, {{ post.content|escape }} или {{ post.content|safe }} в html?

Спасибо

EDIT: какой фильтр следует использовать для автоматического преобразования специальных символов в html-объекты?

EDIT 2: Я просто понял, что autoescape не является допустимым фильтром.

4b9b3361

Ответ 1

HTML-экранирование включено по умолчанию в шаблонах Django.

Autoescape - это тег. не фильтр:

{% autoescape on %}
    {{ post.content }}
{% endautoescape %}

Фильтр 'escape' пропускает строку HTML. В частности, он выполняет эти замены:

  • < преобразуется в &lt;
  • > преобразуется в &gt;
  • '(одинарная кавычка) преобразуется в &#39;
  • "(двойная кавычка) преобразуется в &quot;
  • & преобразуется в &amp;

"force_escape" почти идентичен "escape", за исключением нескольких угловых случаев.

"Безопасный" фильтр пометит ваш контент как безопасный, поэтому он не будет экранирован (будет отправлен в браузер как есть).

Какой фильтр следует использовать для автоматического преобразования специальных символов в html-объекты?

Ну, вы имеете в виду, например, преобразование Ã в &Atilde;? Придерживайтесь полной кодировки utf-8 и забывайте об этом.

Ответ 2

прежде всего, вам следует избегать вашего контента, потому что вы никогда не знаете (даже если вы тот, кто вводит данные), если вам понадобится специальный символ (например, <, > ).

Синтаксис, который вы используете, показывает, что вам неудобно использовать экранирование:

это

{% autoescape on %}
    {{ content }}
{% endautoescape %}

точно совпадает с этим

{{ content|escape }}

это

{{ content }}

точно такой же, как этот < - edit: Если autoescape выключен (благодаря Paulo Scardine)

{{ content|safe }} 

Безопасное использование:

{% autoescape on %}
    {{ content }}  <-- escape
    {{ content|safe }}  <-- not escape
{% endautoescape %}

Ответ 3

Ваш вопрос показывает, что вы немного смущены тем, что происходит.

Escaping превращает небезопасные символы - например, теги HTML - в экранированные версии, чтобы вредоносный контент, такой как теги script, не разрушал ваш сайт. Django делает это по умолчанию для всего содержимого, отображаемого в шаблоне из переменной.

Кажется, по вашему комментарию, что вы только редактируете свой контент, что вам нужно, чтобы отображать переменные без автоматического экранирования. Итак, для этого вам нужно отметить это как безопасное. Вы можете либо сделать это в шаблоне, либо обернув всю партию в тегах {% autoescape off %}...{% endautoescape %}, либо через фильтр {{ myvar|safe }} для отдельных переменных. Или вы можете сделать это в представлении, вызвав mark_safe(myvar) для отдельных переменных, прежде чем передавать их в шаблон.

Ответ 4

Чтобы избежать экранирования, используйте "безопасный" (https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#safe):

Отмечает строку как не требующую дальнейшего вывода HTML до вывода. Когда автовоспроизведение выключено, этот фильтр не действует.

Чтобы избежать использования "escape" (https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#escape):

Сбрасывает строку HTML.