Django:应该覆盖哪个方法或函数以将 markdown2 应用于通用视图渲染?

Django: Which method or function should be overriden to apply markdown2 to generic view rendering?

我可以应用 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 转换。现在,详细视图 class 只是:

class EntryDetailView(generic.DetailView):
    model = Entry
    slug_field = 'subject'
    slug_url_kwarg = 'subject'

将对象呈现给视图的其余功能嵌入在 Django 服务器代码中。我需要访问相关代码以将其重写为本地方法以获取 Markdown2 转换。 class 是哪个方法?或者,是否可以通过某种方式直接在模板上进行 markdown2 转换?

http: 包 response.py 中的 HttpResponse(HttpResponseBase) class 中的 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 日更新:

根据第一个答案的建议,markdown 可以在模板中完成。这要简单得多,也更有意义。根据建议,我将 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 作为 OS、Python 3.8 版和 Django 3.0.8 版。

我们如何将 django_markdown2 添加到 PYTHONPATH?非常感谢任何帮助。

您可以直接在模板中使用Markdown2。首先务必将 django_markdown2 添加到您的 INSTALLED_APPS。然后在您的模板顶部添加 {% load md2 %}。然后你可以使用像 {{ page.content|markdown }}

这样的模板标签渲染降价