自定义django字段,便于在文本字段中使用标记

django-markitup-field的Python项目详细描述


django的自定义标记字段的实现。标记字段在 用关联的标记格式和MarkItUp!标记来表示文本字段的本质 带有ajax预览的编辑器小部件。该字段还将其渲染值缓存在 假设磁盘空间比Web应用程序中的CPU周期便宜。

基于django-markupfield 以及django-markitup

安装

安装django markitup字段的推荐方法是 pip

使用easy_installpip:从pypi安装

pip install django-markitup-field

或者获取in-development version

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,则 以下标记类型可用:

HTML:
允许HTML,可能不安全
文本:
纯文本标记、调用urlize并用换行符替换文本
降价:
默认的markdown渲染器(仅当python-markdown已安装时)
重新构造文本:
默认的ReST渲染器(仅当docutils已安装时)
纺织品:
默认的textile渲染器(仅当textile已安装时)

用法

使用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_formatmarkup_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_saferendered允许标记字段 在模板中显示为其渲染的自身而不显示任何模板的对象 标记或必须直接访问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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将数据从UI传递到数据库JSF、JPA等   静态和非静态的java错误   java Hibernate打开会话两次,需要事务   泛型对于这个简单的Java层次结构问题,我的最佳方法是什么?   googleappengine上的javasqlite   java如何实现或找到threadsafe CompletionService的等价物?   java类访问不同线程上的父类   调用SQLException时发生java RuntimeException。getMessage()(DB2)   java JTree:可变行高   链表编写一种方法,以升序对单个linkedlist进行排序(java)   java将TileMap加载到stage类libgdx中   java如何将数据正确添加到嵌套hashmap