当梦想照进现实

Django1.6自定义markdown过滤器

2014.11.20

Markdown

1. 背景

  1. Django自1.6版本开始就取消了markdown这个标签;
  2. 之前用django-markdown-deux实现了Django1.6的Markdown功能,后来发现这货不支持直接输入HTML,会把所有的<>都转码,加上autoescape|safe都不好使。

于是就找到了自定义template tag这种形式,发现实现起来也很简单,使用时也非常趁手。

2. 实现步骤

2.1 创建Template Tags目录

在myproject/myapp目录下创建templatetags目录,并新建两个文件__init__.pydjangomarkdown.py,形成文件结构如下:

myproject/
    myapp/
        __init__.py
        models.py
        templatetags/
            __init__.py
            djangomarkdown.py
        views.py
  • __init__.py照例是确保该目录作为Python包使用;
  • djangomarkdown.py是具体设置的脚本,但要注意这个文件命名是以后模板过滤器使用的,所以不要和已存在的或其他app的过滤器冲突。

2.2 编辑 djangomarkdown.py

djangomarkdown.py代码如下:

# -*- coding: utf-8 -*-

import markdown2

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 djangomarkdown(value):
    return mark_safe(markdown2.markdown(force_unicode(value),
                                        extras=["code-friendly"]
                                        )
                     )

这样djangomarkdown.py就完成了。

2.3 在template中使用

使用很简单,在模板文件头部加载{% load djangomarkdown %},然后{{ value|djangomarkdown }}即可!
注意

  1. 设置完成后要**重启服务**才能直接使用。
  2. {% load djangomarkdown %}一般放在{% extends 'base.html' %}`之后。

3. 参考资料

4. 版本

  • Python2.7
  • Django1.6
Comments
Write a Comment