wagtail'中的片段id链接;s的富文本内容

wagtail'中的片段id链接;s的富文本内容,wagtail,Wagtail,我在Wagtail 2.0富文本字段中有一堆内容,看起来像 Page heading (intro blurb) heading 1 (heading-1-relevant text) heading 2 (heading-2-relevant text) ... 我想给每个标题一个id,这样任何文本都可以链接到相关内容。我似乎找不到为标题提供显式id的选项,富文本编辑器中的“链接”按钮似乎不允许我在内容中选择活动片段标识符 有没有办法在同一页面上添加基于片段标识符的导航使用Wagtai

我在Wagtail 2.0富文本字段中有一堆内容,看起来像

Page heading
(intro blurb)

heading 1
(heading-1-relevant text)

heading 2
(heading-2-relevant text)

...
我想给每个标题一个
id
,这样任何文本都可以链接到相关内容。我似乎找不到为标题提供显式
id
的选项,富文本编辑器中的“链接”按钮似乎不允许我在内容中选择活动片段标识符


有没有办法在同一页面上添加基于片段标识符的导航使用Wagtail的富文本编辑器?

要控制页面正文的结构,最好鼓励用户使用标题块,而不是富文本块中的标题。然后您可以有一个标题块类型,它有两个字段,一个“text”和一个“id”,您可以使用
id
属性输出
h
元素

class Heading2Block(blocks.StructBlock):
    heading = blocks.CharBlock(classname='full title')
    link_id = blocks.CharBlock(help_text='For making hyperlinks to this heading')

    class Meta:
        template = 'blocks/h2.html'
将以下内容放入
块/h2.html

<h1{% if value.link_id %} id="{{ value.link_id|slugify }}"{% endif %}>{{ value.heading }}</h1>
{{value.heading}

在Wagtail的早期版本中,可以从Hallo.js富文本编辑器中删除
h
小部件,这是鼓励用户采用标题块的好方法。类似的限制目前在Draftail中不存在,但有一种方法可以重新实现它。

一年后,因为这仍然是我们需要的,所以我们提出的解决方案是简单地包装RichText html序列化,并将片段id注入放在最上面:

重新导入
从django导入模板
从django.utils.text导入slugify
从wagtail.core.rich_文本导入RichText
#我们将包装原始RichText.\uuuuHTML\uuuuuuu(),因此请
#当然我们可以打电话给它。
__原始的\uuuuuhtml\uuuuuu=RichText.\uuuuuuhtml__
#这与h1/../h6匹配,使用的regexp仅为
#保证有效,因为我们知道
#我们将要使用的HTML代码生成的代码很好
#和可预测的HTML代码(注意非贪婪
#标题内容为“一个或多个”)。
标题(r“]*)>(.+?)”
def添加id属性(匹配):
"""
这是一个regexp替换函数,需要
在上面的正则表达式中匹配结果,然后旋转:
一些文本
进入:
其中id属性值是通过运行
通过Django的slagify()函数显示标题文本。
"""
n=匹配。组(1)
属性=匹配。组(2)
text\u content=match.group(3)
id=slugify(文本内容)
返回f“”
带有标题ID的def(自身):
"""
我们实际上并没有改变RichText.\uuuuHTML\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
它有一个函数,可以“做它已经做过的事情”,再加上一个
添加片段ID及其关联链接的替换过程
元素添加到可能位于富文本内容中的任何标题。
"""
html=\uuuuu原始\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
return re.sub(heading\u re,add\u id\u属性,html)
#重新绑定RichText的html序列化函数,以便
#就wagtail而言,输出仍然完全可用
#可以分辨,除了带有片段ID的标题。
RichText.\uuuuhtml\uuuuu=带有\u标题\u ID
这工作得相当好,不需要在draftail或wagtail中进行任何黑客攻击,只需将此代码作为服务器启动过程的一部分加载即可轻松启用/禁用(我们的wagtailcustom_tags.py文件中有它,因此当Django加载所有模板标记集时,RichText“扩展”会自动启动)


我们最初试图扩展
。|richtext
模板过滤器,但尽管这是完全可能的,但它只适用于我们自己编写的自定义块,使用我们自己的自定义模板,因此,考虑到它应该“正常工作”的想法,这不是一个解决方案。

正如@Alexey所指出的,与hallo.js相比,定制Draftail来实现这一点可能是一个更好的前景,但上面的工作更少。我还意识到,我只是假设您使用的是流字段和富文本块,而不是直接在页面模型上使用RichTextField。同样,在Wagtail的Zen中,强迫内容创作者分解他们的内容是带着开发人员的帽子思考。如果观众是其他开发人员就可以了,但事实并非如此。编辑draftail使片段链接工作看起来是前进的方向。我不同意这种解释。编辑器不应该使用富文本字段以所见即所得的方式生成页面结构,而仅仅是格式化文本。将标题(或图像或块引号)转换为它们自己的块类型会将结构从富文本字段中移除,并且作为一个额外的功能,将标记放在开发人员手中。这个特殊的病例是一个稍微灰色的区域。我想说,如果
id
属性是自动生成的,那么Draftail功能将覆盖它,但是对于编辑器交互的东西,单独的块是更好的选择。这里有两个单独的问题:如何在富文本中的标题上添加id,以及如何添加带有片段标识符的链接。这两个问题目前都没有简单的答案(sob),因此它们可能需要单独的问题。有关带有片段标识符的链接,请参见。我将在这里发表评论,解释这如何适用于标题上的
id
,Wagtail目前没有为富文本内容提供这一级别的定制。正如@nimasmi所描述的,您最好的选择“立即”是StreamField,您为内容创建者描述了一些限制。如果您想要的是基于上下文、引用计数或块文本的自动生成ID,那么前进的方向就是。如果您想要的是用户控制的ID,那么没有办法自定义富文本编辑器标题块渲染以在其中添加字段。最好的办法是创建一个自定义实体(如in和官方文档“Stock”),允许作者在任意文本上放置带有id的标记,或在内容的任意点放置没有文本的标记–例如