【发布时间】:2020-12-24 23:43:33
【问题描述】:
我能够应用 Markdown2 将标记下的文本从数据库转换为在模板 html 页面上呈现的 HTML。
相关代码:
views.py
page = entry.content
page_converted = markdown2.Markdown().convert(page)
context = {'mdentry': page_converted, "subject":subject}
return render(request, "wikiencyc/md_entry.html", context)
md_entry.html
{% block content %}
{{ mdentry|safe }}
{% endblock %}
问题是如何将 Markdown2 转换应用于通用 DetailView,其中所有样板 python 代码都在 django 服务器代码中。我知道我必须在 django 服务器代码中找到相关的方法或函数,并将其覆盖为通用视图中的本地方法以完成 Markdown2 转换。现在,detailview 类只是:
class EntryDetailView(generic.DetailView):
model = Entry
slug_field = 'subject'
slug_url_kwarg = 'subject'
将对象呈现到视图的其余功能嵌入在 django 服务器代码中。我需要访问相关代码以将其覆盖为本地方法以获取 Markdown2 转换。它会是哪个类的哪个方法?或者,能否以某种方式直接在模板上进行 markdown2 转换?
http: 包的 response.py 中的 HttpResponse(HttpResponseBase) 类中的 content(self, value) 方法可能是一个很好的替代方法。代码如下所示。
@content.setter
def content(self, value):
# Consume iterators upon assignment to allow repeated iteration.
# print("line 314 in response, value = ", value)
if hasattr(value, '__iter__') and not isinstance(value, (bytes, str)):
content = b''.join(self.make_bytes(chunk) for chunk in value)
if hasattr(value, 'close'):
try:
value.close()
except Exception:
pass
else:
content = self.make_bytes(value)
# Create a list of properly encoded bytestrings to support write().
self._container = [content]
我不确定如何解析内容以便将文本子集转换为 HTML。非常感谢任何帮助。
2020 年 9 月 7 日更新:
根据第一个答案的建议,可以在模板中完成降价。这更简单,也更有意义。根据建议,我将 django_markdown2 添加到 INSTALLED_APPS,并在模板标签中实现了上述 markdown 语法。
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'wikiencyc',
'django_markdown2',
]
entry_detail.html
{% load md2 %}
<h4>{{ entry.subject }} </h4>
<br><br>
<p>
{{ entry.content|markdown:"safe" }}
</p>
但是,django 服务器无法启动,并且我收到一长串异常以响应 python manage.py runserver 命令。如果我从 INSTALLED_APPS 注释掉“django_markdown2”,django 服务器启动正常,但是当应用程序尝试在模板中加载 md2 时出现以下异常:
Request Method: GET
Request URL: http://127.0.0.1:8000/wikiencyc/entry/8
Django Version: 3.0.8
Exception Type: TemplateSyntaxError
Exception Value:
'md2' is not a registered tag library. Must be one of:
admin_list
admin_modify
admin_urls
cache
i18n
l10n
log
static
tz
根据this source,我需要
将 django_markdown2 放在 PYTHONPATH 中的某个位置
我没有处理 PYTHONPATH 的经验。我使用 Windows 7 作为操作系统,Python 3.8 版和 Django 3.0.8 版。
我们如何将 django_markdown2 添加到 PYTHONPATH?非常感谢任何帮助。
【问题讨论】: