Python

Django1.6自定义markdown过滤器

针对Django1.6取消原生markdown标签且第三方库存在HTML转码问题,本文介绍自定义模板过滤器的解决方案。通过创建templatetags目录并编写djangomarkdown.py脚本,利用markdown2库实现Markdo

图片暂缺

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. 设置完成后要重启服务才能直接使用。 1. {% load djangomarkdown %}一般放在`之后。

3. 参考资料

4. 版本

  • Python2.7
  • Django1.6

评论

暂无评论,来写第一条吧 👇

写下你的评论

邮箱仅用于识别身份,不会公开显示