使用降价:"安全"在Django中给出了语法错误

时间:2014-08-05 09:25:38

标签: django django-templates markdown

在研究了我的问题后(​​" HTML_REMOVED"将内联html放入降价时),我遇到了this。但是,当我尝试这个解决方案时,它会给我一个语法错误:

Exception Type: TemplateSyntaxError
Exception Value:    
custom_markdown requires 0 arguments, 1 provided

我正在使用Django 1.6.5。

模板

{% extends "blogengine/includes/post.html" %}

    {% load custom_markdown %}

    {% block content %}
        <div class="post">
        <h1 id="post-title">{{ object.title }}</h1>
        <p id="post-date">{{ object.pub_date }}</p>
        <div id="post-body">
        {{ object.text|custom_markdown:"safe" }}
        </div>
        </div>

{% endblock %}

custom_markdown.py

import markdown

from django import template
from django.template.defaultfilters import stringfilter
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe

register = template.Library()

@register.filter(is_safe=True)
@stringfilter
def custom_markdown(value):
    extensions = ["nl2br", ]

    return mark_safe(markdown.markdown(force_unicode(value),
                                       extensions,
                                       safe_mode=True,
                                       enable_attributes=False))

澄清:我的问题是:如何让markdown接受内联HTML?我知道安全导致语法错误。

增加: 添加简单标记<a href="www.google.com">test</a>时,结果如下: enter image description here

2 个答案:

答案 0 :(得分:4)

您正在将一个额外的参数传递给不需要任何参数的过滤器。正确的电话应该是:

{{ object.text|custom_markdown }}

过滤器custom_markdown已经管理了自己渲染过程允许内容中的HTML(使用@register.filter(is_safe=True)装饰器和mark_safe函数)


According to this answer,已经有一个允许使用django.contrib.markup.templatetags的HTML过滤器,因此您不需要创建自己的过滤器(我认为您将这两个想法混合在一起):< / p>

{{ object.text|markdown:"safe" }}

答案 1 :(得分:0)

好的,我实际上已经找到解决方案是我们一直在讨论的相反。我发现here启用安全模式禁用 html。因此,将 custom_markdown.py 更改为以下内容后,就可以了。

import markdown

from django import template
from django.template.defaultfilters import stringfilter
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe

register = template.Library()

@register.filter(is_safe=False)
@stringfilter
def custom_markdown(value):
    extensions = ["nl2br", ]

    return mark_safe(markdown.markdown(force_unicode(value),
                                       extensions,
                                       safe_mode=False,
                                       enable_attributes=False))