在研究了我的问题后(" 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 %}
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>
时,结果如下:
答案 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))