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 }}
这样的模板标签渲染降价
我可以应用 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 }}