用于在文本字段中轻松使用标记的自定义Django字段
项目描述
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
- restructuredtext
您还可以通过在模型声明中将 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_type 或 markup_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_safe 在 rendered 上,允许 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的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1bcc15972066914ee46ae3fddf859f653903a3af7c91d468572e3a1fe0c74fda |
|
MD5 | ee50cfc3fa308ea6cb6896be8a7b8979 |
|
BLAKE2b-256 | 11a67d7f2edf6a9d9b56b888c3d7aebc3aedf7e12b0e922ab7dbc9322977c620 |
django-markupfield-2.0.1-py2.py3-none-any.whl的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 03fa9c4a919e07969bfbb6143b2889541201b6fd0fa10980367772ed542d438e |
|
MD5 | 3a7ffdc4784c370db0d46f9edd802984 |
|
BLAKE2b-256 | 9320de1d6fef4907977b03e3f9750a70e7c9ce52a00f0133d1f6ce0c90383e86 |