我想在我正在使用Github风格的Markdown构建的Django博客中替换标准的Markdown实现。我想使用Misaka,我将自己的自定义模板标签放在一起。不幸的是,出了点问题。
这是我的模板标签文件,位于blog/templatetags/gfm.py
。 __init__.py
文件存在于同一文件夹中:
from django import template
from django.template.defaultfilters import stringfilter
import misaka as m
register = template.Library()
@register.filter(is_safe=True)
@stringfilter
def gfm(value):
rendered_text = m.html(value,
extensions=m.EXT_FENCED_CODE,
render_flags=m.HTML_ESCAPE)
return rendered_text
这是我的一个模板:
{% extends 'layout/base.html' %}
{% block header %}
{% endblock %}
{% block content %}
{% load gfm %}
{% if object_list %}
{% for post in object_list %}
<div class="post">
<div class="page-header">
<h1><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h1>
</div>
{{ post.text|gfm }}
<p>Posted {{ post.pub_date }}</p>
<p>
{% for category in post.categories.all %}
<a class="badge badge-info" href="/category/{{ category.slug }}/">{{ category.title }}</a>
{% endfor %}
</p>
</div>
{% endfor %}
<br />
<ul class="pager">
{% if page_obj.has_previous %}
<li class="previous"><a href="/{{ page_obj.previous_page_number }}/">Previous Page</a></li>
{% endif %}
{% if page_obj.has_next %}
<li class="next"><a href="/{{ page_obj.next_page_number }}/">Next Page</a></li>
{% endif %}
</ul>
{% else %}
<div class="post">
<p>No posts matched</p>
</div>
{% endif %}
{% endblock %}
输出的文本以双引号返回,这会打破整个事情。否则,生成的标记似乎是正确的。
我在哪里错了?我知道这不是数据库中的数据,就好像我使用pdb来获取函数内的value
和rendered_text
的值,它们被正确呈现。例如,这是一个帖子的纯文本版本,由pdb
打印:
u'A Python application:\r\n\r\n print "Hello world"'
这是使用Misaka在Markdown中呈现的版本:
u'<p>A Python application:</p>\n\n<pre><code>print "Hello world"\n</code></pre>\n'
我对Django很有经验,但我是自定义模板标签的新手。
答案 0 :(得分:2)
使用autoescape标记。
{% autoescape off %}{{ post.text|gfm }}{% endautoescape %}
或者,您可以使用safe过滤器。
{{ post.text|gfm|safe }}