跳转到主要内容

用于在文本字段中轻松使用标记的自定义Django字段

项目描述

https://github.com/jamesturk/django-markupfield/workflows/Test/badge.svg https://img.shields.io/pypi/v/django-markupfield.svg

Django的标记字段实现。标记字段本质上是一个带有相关标记类型的TextField。该字段还假设在Web应用程序中磁盘空间比CPU周期便宜,因此缓存其渲染值。

安装

安装django-markupfield的推荐方法是使用pip

无需将'markupfield'添加到您的INSTALLED_APPS中,只需将其放在您的PYTHONPATH中即可。但是,要使用标题标记,您必须将'markupfield'添加到您的INSTALLED_APPS中,或者将相应的翻译添加到您的项目翻译中。

需求

需要Django >= 2.2和3.6+

  • 1.5.x是最后一个官方支持Django < 2.2或Python 2.7的版本

  • 1.4.x是最后一个官方支持Django < 1.11的版本

  • 1.3.x是最后一个官方支持Django 1.4或Python 3.3的版本

设置

为了最佳使用MarkupField,您应该定义MARKUP_FIELD_TYPES设置,它是一个将字符串映射到可调用的字典,该可调用用于“渲染”标记类型

import markdown
from docutils.core import publish_parts

def render_rest(markup):
    parts = publish_parts(source=markup, writer_name="html4css1")
    return parts["fragment"]

MARKUP_FIELD_TYPES = (
    ('markdown', markdown.markdown),
    ('ReST', render_rest),
)

如果您未定义MARKUP_FIELD_TYPES,则提供了一个带有以下标记类型的默认值

html

允许HTML,可能不安全

plain

纯文本标记,调用urlize并替换文本为换行符

markdown

默认的 markdown 渲染器(仅当已安装 markdown 时可用)

restructuredtext

默认的 ReST 渲染器(仅当已安装 docutils 时可用)

您还可以通过在模型声明中将 markup_choices 选项传递给 MarkupField,以每个字段为基准覆盖 MARKUP_FIELD_TYPES

用法

使用 MarkupField 相对简单,它可以在任何模型定义中使用

from django.db import models
from markupfield.fields import MarkupField

class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)
    body = MarkupField()

然后可以创建具有在 MARKUP_FIELD_TYPES 中定义的任何标记类型的 Article 对象

Article.objects.create(title='some article', slug='some-article',
                       body='*fancy*', body_markup_type='markdown')

您会注意到存在一个名为 body_markup_type 的字段,您没有声明它。实际上,MarkupField 在这里创建了两个额外的字段 body_markup_type_body_rendered。这些字段的名称总是根据声明的 MarkupField 的名称来命名的。

参数

MarkupField 还接受三个可选参数。可以指定 default_markup_typemarkup_type 参数中的一个,但不能同时指定。

default_markup_type:

设置字段将默认使用的 markup_type,如果没有指定。仍然可以编辑 markup_type 属性,并且它将默认出现在 ModelForms 中。

markup_type:

设置字段将始终使用的 markup_type,在隐藏字段上设置 editable=False,因此它不会显示在 ModelForms 中。

markup_choices:

一个替换列表,用于在单个字段的基础上代替 MARKUP_FIELD_TYPES

escape_html:

一个标志(默认为 False),表示输入应被视为不受信任的,因此将运行通过 Django 的 escape 过滤器。

示例

默认使用 markdown 但允许用户进行选择的 MarkupField

MarkupField(default_markup_type='markdown')

使用 ReST 而不提供表单选择的 MarkupField

MarkupField(markup_type='restructuredtext')

使用自定义渲染器集的 MarkupField

CUSTOM_RENDERERS = (
    ('markdown', markdown.markdown),
    ('wiki', my_wiki_render_func)
)
MarkupField(markup_choices=CUSTOM_RENDERERS)

访问模型上的 MarkupField

当访问作为 MarkupField 声明的模型的属性时,将返回一个特殊的 Markup 对象。该 Markup 对象有三个参数

raw:

未渲染的标记。

markup_type:

标记类型。

rendered:

raw 的渲染 HTML 版本,此属性为只读。

此对象有一个 __unicode__ 方法,它调用 django.utils.safestring.mark_saferendered 上,允许 MarkupField 对象在模板中以它们的渲染形式出现,无需任何模板标签或直接访问 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_type 赋值相当于将 a.body.markup_type 赋值。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

django-markupfield-2.0.1.tar.gz (16.1 kB 查看哈希)

上传时间

构建分布

django_markupfield-2.0.1-py2.py3-none-any.whl (16.2 kB 查看哈希)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面