Как передать HTML-данные из Python на уже созданную HTML-страницу для отображения?

Я работаю над проектом Django и хотел бы брать тексты в формате markdown, преобразовывать их в HTML, а затем отображать в браузере. Я провел некоторое исследование и попробовал разные способы, но ни один не сработал так, как я хотел.

Вот мой код:

Python:

class HTMLFilter(HTMLParser):
    text = ""
    def handle_data(self, data):
        self.text += data

def display_entry(request, entry):

    if util.get_entry(entry.capitalize()) != None:

        markdowner = Markdown()
        data = markdowner.convert(util.get_entry(entry.capitalize()))

        html = HTMLFilter()
        html.feed(data)
        
        body = html.text

        return render(request, "encyclopedia/display.html", {
            "title": entry,
            "body": body
        })

    else:

       return render(request, "encyclopedia/error.html", {
            "entry": entry.capitalize()
       })        

Вот как выглядит функция (get_entry()) из модуля util:

def get_entry(title):
    try:
        f = default_storage.open(f"entries/{title}.md")
        return f.read().decode("utf-8")
    except FileNotFoundError:
        return None

Я использую пакет python-markdown2 для преобразования языка markdown в HTML, и он отлично работает. Ниже приведен пример текста, который был преобразован в HTML.

<h1>Django</h1> <p>Django is a web framework written using <a href="/wiki/Python">Python</a> that allows for the design of web applications that generate <a href="/wiki/HTML">HTML</a> dynamically.</p>

Моя самая большая проблема - отобразить этот текст в браузере как обычный HTML. Вот как выглядит мой HTML-файл:

{% extends "encyclopedia/layout.html" %}

{% block title %} {{ title }} {% endblock %}

{% block body %}

    {{ body }}

{% endblock %}

После использования HTMLParser из html.parser я получаю такие результаты:

Django Django is a web framework written using Python that allows for the design of web applications that generate HTML dynamically.

Это не то, что я хочу, поскольку он полностью игнорирует заголовки, ссылки и другие важные HTML-теги.

Я пробовал другие способы, но они не сработали, как я ожидал.

Заранее спасибо.

Вы можете изменить свой шаблон следующим образом, чтобы отображать HTML-строки с помощью safe filter

{% extends "encyclopedia/layout.html" %}

{% block title %} {{ title }} {% endblock %}

{% block body %}

    {{ body |safe }}

{% endblock %

для получения дополнительной информации https://docs.djangoproject.com/en/4.0/ref/templates/builtins/#std-templatefilter-safe

Не нужен парсер HTML, так как мы уже получаем HTML из библиотеки markdown.

def display_entry(request, entry):
    entry_content = util.get_entry(entry.capitalize())
    if entry_content != None:
        markdowner = Markdown()
        body_html = markdowner.convert(entry_content)
        return render(request, "encyclopedia/display.html", {
            "title": entry,
            "body": body_html
        })
    else:
       return render(request, "encyclopedia/error.html", {
            "entry": entry.capitalize()
       })    

В вашем шаблоне вы должны использовать фильтр safe, чтобы django не экранировал вашу строку.

Django Docs: https://docs.djangoproject.com/en/4.0/ref/templates/builtins/#std-templatefilter-safe

{% extends "encyclopedia/layout.html" %}

{% block title %} {{ title }} {% endblock %}

{% block body %}

    {{ body|safe }}

{% endblock %}
Вернуться на верх