1. 背景
- Django自1.6版本开始就取消了
markdown
这个标签; - 之前用django-markdown-deux实现了Django1.6的Markdown功能,后来发现这货不支持直接输入HTML,会把所有的
<>
都转码,加上autoescape
,|safe
都不好使。
于是就找到了自定义template tag这种形式,发现实现起来也很简单,使用时也非常趁手。
2. 实现步骤
2.1 创建Template Tags目录
在myproject/myapp目录下创建templatetags
目录,并新建两个文件__init__.py
和djangomarkdown.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 }}
即可!
注意:
- 设置完成后要重启服务才能直接使用。
- {% load djangomarkdown %}
一般放在
{% extends 'base.html' %}`之后。
3. 参考资料
- Django 配置支持 Markdown 语法
- Supporting Markdown in upcoming Django releases
- 【官方】Custom template tags and filters
4. 版本
- Python2.7
- Django1.6