Почему мои преобразованные HTML-теги Markdown возвращаются как текст?

Функция в моем файле views.py конвертирует файлы Markdown и возвращает HTML в другую функцию, которая используется для отображения текущей записи (entry()). В entry() у меня есть словарь, который дает HTML-шаблону доступ к преобразованному содержимому. Однако, когда теги <h1> и <p> показываются на странице вместо того, чтобы быть скрытыми.

Так,

<h1>CSS</h1> <p>CSS is a language that can be used to add style to an <a href="/wiki/HTML">HTML</a> page.</p>

отображается вместо

CSS

CSS - это язык, который можно использовать для добавления стиля к странице HTML.

--

Как избавиться от тегов на странице и заставить их действительно использоваться в HTML-файле?

entry.html:

{% block body %}
<div class="entry-container">
    <div class="left">
        {{ entry }}
    </div>
    <div class="right">
        <a href="{% url 'edit' %}" class="edit-btn">
            <button class="edit">EDIT</button>
        </a>
    </div>
</div>
{% endblock %}

views.py:

import markdown
from . import util

def entry(request, name):
    entry = util.get_entry(name)
    converted = convert(entry)
    if util.get_entry(name) is not None:
        context = {
            'entry': converted,
            'name': name
        }
        global current_entry
        current_entry = name
        return render(request, 'encyclopedia/entry.html', context)
    else:
        return render(request, "encyclopedia/404.html")

def convert(entry):
    return markdown.markdown(entry)

urls.py:

path('<str:name>', views.entry, name='entry'),

util.py:

def get_entry(title):
    """
    Retrieves an encyclopedia entry by its title. If no such
    entry exists, the function returns None.
    """
    try:
        f = default_storage.open(f"entries/{title}.md")
        return f.read().decode("utf-8")
    except FileNotFoundError:
        return None

Django применяет фильтр для HTML-тегов в вариациях. Если вы хотите получить нефильтрованный вывод, вы должны применить фильтр safe:

{{ entry | safe }}

Django будет автозавершать преобразованный HTML, который вы передаете в шаблон, и не будет отображать HTML-теги. Чтобы остановить это, вы можете использовать safe templatetag:

{{ entry|safe }}

https://docs.djangoproject.com/en/4.0/ref/templates/builtins/#safe

Вернуться на верх