Как передать 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 %}