1

私が構築している Django ブログの標準の Markdown 実装を、Github フレーバーの 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

そして、これが私のテンプレートの1つです:

{% 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 &quot;Hello world&quot;\n</code></pre>\n'

私は Django にはかなりの経験がありますが、カスタム テンプレート タグは初めてです。

4

1 に答える 1

2

autoescapeタグを使用します。

{% autoescape off %}{{ post.text|gfm }}{% endautoescape %}

または、安全なフィルターを使用できます。

{{ post.text|gfm|safe }}
于 2013-08-31T22:10:02.940 に答える