TypeError使用自定义模板标记

时间:2013-06-22 04:10:12

标签: django

我使用以下模板标记获取'module' object is not callable

projectname/controlpanel/templatetags/__init__.py(空白档案)

projectname/controlpanel/templatetags/md_to_html.py

from django import template
from markdown import markdown

register = template.Library()


@register.filter(name='to_html')
def to_html(md):
    return markdown(md)

在我的一个观看中,我返回{'campaign': campaign},其中campaign是具有description TextField的模型的实例。

<div class="span8" id="editor2">
   {{ selected_campaign.description|to_html }}
</div>

2 个答案:

答案 0 :(得分:1)

将此添加到INSTALLED_APPS

'django.contrib.markup',

将降价标记(http://pypi.python.org/pypi/Markdown)复制到您的django项目目录

然后使用

{% load markup %}
<div class="span8" id="editor2">
      {{ selected_campaign.description|markdown:"safe" }}
</div>

更新

Django 1.5中不推荐使用

django.contrib.markup。这是降价过滤器的简单替代品。

'django.contrib.markup',

中删除行INSTALLED_APPS

创建模板标记的步骤:

  • 在任意templatetags文件夹中添加文件夹app
  • templatetags文件夹中添加一个空文件__init__.py

使用以下代码在markup.py内添加templatetags

from django import template
from django.utils.safestring import mark_safe
import markdown as mkdn

register = template.Library()     
@register.filter
def markdown(value,smode=None):
    return mark_safe(mkdn.markdown(value, safe_mode='escape'))

答案 1 :(得分:0)

我不知道为什么但是markdown似乎在django中的函数内部不起作用,例如我在django shell中输入了这个(python manage.py shell):

from markdown import markdown

def yes():
     return markdown("YES")

它给了我下一个错误:

NameError: global name 'markdown' is not defined

这似乎有效

def yes():
     from markdown import markdown
     return markdown("YES")

在django shell之外第一种方法正常工作希望这有帮助!