自定义django字段,便于在文本字段中使用标记
django-markitup-field的Python项目详细描述
django的自定义标记字段的实现。标记字段在 用关联的标记格式和MarkItUp!标记来表示文本字段的本质 带有ajax预览的编辑器小部件。该字段还将其渲染值缓存在 假设磁盘空间比Web应用程序中的CPU周期便宜。
基于django-markupfield 以及django-markitup。
安装
安装django markitup字段的推荐方法是 pip
使用easy_install或pip:从pypi安装
pip install django-markitup-field
pip install django-markitup-field==tip
无需将'markitup_field'添加到INSTALLED_APPS,它 只需要在你的PYTHONPATH上。
如果要使用基于ajax的预览,请添加 url(r'^markitup/',include('markitup.urls'))在根urlconf中。
要求
django markitup字段取决于django的相对最新版本 (用1.3-1.4测试,可以用1.2但不能保证)和库 您希望包含的任何标记选项。
设置
您可以定义MARKUP_FILTERS设置,字符串的映射 “呈现”标记类型的可调用项:
import markdown from docutils.core import publish_parts def render_rest(markup): parts = publish_parts(source=markup, writer_name="html4css1") return parts["fragment"] MARKUP_FILTERS = ( ('markdown', markdown.markdown), ('restructuredtext', render_rest), )
如果未定义MARKUP_FILTERS,则 以下标记类型可用:
用法
使用markupfield相对容易,它可以用于任何模型定义:
from django.db import models from markitup_field.fields import MarkupField class Article(models.Model): title = models.CharField(max_length=100) slug = models.SlugField(max_length=100) body = MarkupField()
Article对象可以用 MARKUP_FORMATS:
Article.objects.create(title='some article', slug='some-article', body='*fancy*', body_markup_format='markdown')
您会注意到一个名为^ {TT11}$的字段,您确实这样做了。 不是declare,markupfield实际上创建了两个额外的字段。body_markup_format 此字段始终根据声明的MarkupField的名称命名。
参数
MarkupField还接受三个可选参数。或者 default_markup_format和markup_format参数可以指定,但是 不是两者都有。
- default_markup_format:
- 设置标记类型,如果未指定标记类型,则该字段将默认为该类型。 仍然可以编辑标记类型属性,它将显示 默认情况下,在模型窗体中。
- markup_format:
- 设置字段将始终使用的标记类型,editable=False已设置 在“隐藏”字段中,以便它不在模型窗体中显示。
- markup_choices:
- 替代标记选择的替换列表 MARKUP_FORMATS每个字段。
- escape_html:
- 一个标志(默认情况下为false),表示应将输入视为 不受信任,因此将通过django的escapefilter运行。
- rendered_field_name:
- 具有呈现内容的字段的名称。如果设置为“无”, 然后它命名为<;field\u name>;\u rendered
示例
MarkupField,默认使用降价,但允许用户选择:
MarkupField(default_markup_type='markdown')
MarkupField将使用纺织品而不提供表单选择:
MarkupField(markup_type='textile')
MarkupField将使用自定义的渲染器集:
CUSTOM_RENDERERS = ( ('markdown', markdown.markdown), ('wiki', my_wiki_render_func) ) MarkupField(markup_choices=CUSTOM_RENDERERS)
访问模型上的标记字段
访问声明为^{tt13}的模型的属性时$ 返回一个特殊的Markup对象。Markup对象有三个 参数:
- raw:
- 未显示的标记。
- markup_format:
- 标记类型。
- rendered:
- 呈现的HTML版本raw,此属性是只读的。
此对象有一个__unicode__方法,该方法调用 django.utils.safestring.mark_safe在rendered允许标记字段 在模板中显示为其渲染的自身而不显示任何模板的对象 标记或必须直接访问rendered。
假设上面的Article模型:
>>> a = Article.objects.all()[0] >>> a.body.raw u'*fancy*' >>> a.body.markup_type u'markdown' >>> a.body.rendered u'<p><em>fancy</em></p>' >>> print unicode(a.body) <p><em>fancy</em></p>
赋值给a.body等同于赋值给a.body.raw和 赋值给a.body_markup_format等同于赋值给 a.body.markup_format。
注意
仅当调用.save()时才会更新a.body.rendered