【问题标题】:Django: Which method or function should be overriden to apply markdown2 to generic view rendering?Django:应该重写哪个方法或函数以将 markdown2 应用于通用视图渲染?
【发布时间】: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?非常感谢任何帮助。

【问题讨论】:

    标签: python django markdown


    【解决方案1】:

    您可以直接在模板中使用 Markdown2。首先确保将django_markdown2 添加到您的INSTALLED_APPS。然后在您的模板中在顶部添加{% load md2 %}。然后你可以使用{{ page.content|markdown }}这样的模板标签来渲染markdown

    【讨论】:

    • 谢谢你。我按照您的建议做了,但 django 服务器无法启动并出现错误。请参阅有关问题的更新。我认为问题在于将 django_markdown2 放置在 PYTHONPATH 中的某个位置。我们如何做到这一点?
    • 顺便说一句,我在 INSTALLED_APPS 中使用 django_markdown2 得到的错误是 Python38-32/lib/pathlib.py 中第 200 行的“
    • 使用pip freeze 来检查你是否安装了markdown2。如果没有,请使用pip install django-markdown2 安装它。如果您使用的是虚拟环境,请确保它已激活
    • 谢谢。误解的核心是非常不直观的需要有 2 个单独的包 django_markdown2 和 markdown2。常识意味着一个包被包含在另一个包中。没有标签功能的 Markdown2 大大限制了它的实用性。我会要求上述消息来源更新他们的信息,以指出此时 django_markdown2 和 markdown2 是单独的包,并且必须单独安装。也没有必要改变 PYTHONPATH
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多