You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Wagtail CMS Draftail编辑器外链rel属性无法保存问题

在Wagtail CMS中为Draftail外链添加rel属性的解决方案

问题背景

已通过继承外链选择表单、视图并注册钩子,在Draftail编辑器的外链选择界面添加了noreferrer/nofollow的rel属性选择项,但保存富文本内容时,rel属性并未被写入数据库的链接中。

已完成的前端配置代码

自定义外链选择表单

from wagtail.contrib.forms.forms import ExternalLinkChooserForm
from django import forms
from django.utils.translation import gettext_lazy as _

class CustomExternalLinkChooserForm(ExternalLinkChooserForm):
    rel = forms.ChoiceField(
        choices=[
            ("noreferrer", "Noreferrer"),
            ("nofollow", "Nofollow"),
        ],
        required=False,
        label=_("Rel Attribute"),
    )

自定义外链视图

from wagtail.contrib.forms.views import ExternalLinkView

class CustomExternalLinkView(ExternalLinkView):
    form_class = CustomExternalLinkChooserForm

注册覆盖核心视图

from django.urls import path
from wagtail.core import hooks

@hooks.register("register_admin_urls")
def register_custom_external_link_view():
    return [
        path(
            "admin/choose-external-link/",
            CustomExternalLinkView.as_view(),
            name="wagtailadmin_choose_page_external_link",
        )
    ]

核心问题与解决步骤

问题根源

默认的ExternalLinkView在处理表单提交时,仅向Draftail编辑器返回url和title字段,未包含自定义的rel值,导致编辑器无法将该属性写入数据库。

步骤1:修改视图,传递rel属性给编辑器

重写CustomExternalLinkView的get_result_data方法,将表单中的rel值加入返回数据:

class CustomExternalLinkView(ExternalLinkView):
    form_class = CustomExternalLinkChooserForm

    def get_result_data(self, form):
        # 先获取默认返回数据
        data = super().get_result_data(form)
        # 提取并添加rel属性
        rel_value = form.cleaned_data.get("rel")
        if rel_value:
            data["rel"] = rel_value
        return data

步骤2:自定义外链处理器,处理rel属性的存储与渲染

Wagtail通过LinkHandler处理富文本中链接的序列化(存储到数据库)和反序列化(渲染为HTML),需要自定义处理器来支持rel属性:

from wagtail.rich_text import LinkHandler
from wagtail.rich_text.features import LinkHandlerFeature, register_rich_text_feature

class CustomExternalLinkHandler(LinkHandler):
    identifier = "external"  # 对应Draftail的external链接类型

    @classmethod
    def get_attributes(cls, attrs):
        # 从编辑器传递的attrs中提取rel,用于生成数据库存储的属性
        attributes = super().get_attributes(attrs)
        if "rel" in attrs:
            attributes["rel"] = attrs["rel"]
        return attributes

    @classmethod
    def expand_db_attributes(cls, attrs):
        # 从数据库存储的attrs中提取rel,渲染为HTML链接
        href = attrs["href"]
        rel_attr = attrs.get("rel", "")
        return f'<a href="{href}" rel="{rel_attr}">'

# 注册自定义的外链处理特征
@register_rich_text_feature("external_link", LinkHandlerFeature)
def register_external_link_feature(features):
    features.register_link_handler(CustomExternalLinkHandler)

步骤3:验证效果

重新启动Wagtail服务后,在Draftail中添加外链并选择rel属性,保存后查看数据库中的富文本内容(通常为JSON格式),会看到external类型的链接已包含rel字段;渲染页面时,HTML链接也会带上对应的rel属性。

内容的提问来源于stack exchange,提问作者Dhruvin Kalathiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:20:54