【问题标题】:How to force external URLs inserted in the wagtail Draftail editor to open on the new tab?如何强制插入 wagtail Draftail 编辑器中的外部 URL 在新选项卡上打开?
【发布时间】:2026-02-15 18:35:01
【问题描述】:

基本上我需要将target="_blank" 属性添加到wagtail 中插入的所有外部URL Draftail richtext 编辑器:

In [2]: wagtail.__version__
Out[2]: '2.0.1'

EDIT-1这不是重复的wagtail 版本 2 使用完全不同的 richtext 编辑器。

提议的answer 建议$('a[href^="http://"]').attr('target', '_blank') 将适当的属性添加到包含http://页面上的所有链接。这是非常不理想的解决方案,因为页面上可能有更多不需要这种处理的链接。显然必须有更充分的修复,尤其是因为wagtail 已经区分了编辑器 UI 上的InternalExternal 链接(见附图)。

EDIT-2

似乎在wagtail.core.rich_text.feature_registry.FeatureRegistry 类中有一个方法,据我所知,它为不同的 URL 类型分配了不同的处理程序,但是我不知道这些处理程序是什么,它们是如何被调用的或如何修改它们?

def register_link_type(self, link_type, handler):
    self.link_types[link_type] = handler

【问题讨论】:

  • 这不是重复的,因为 wagtail 版本 2 使用完全不同的富文本编辑器。
  • 你真的看过那里的答案吗?该解决方案完全独立于后端编辑器。
  • 这是重复的。富文本编辑器发生了变化,但链接选择器没有变化,服务器端处理也大体相同。
  • @ThibaudColas 正如我在 Edit-1 中解释的那样,建议的答案只不过是JavaScript hack。你可以用大量的 JavaScript 来掩盖几十个框架问题,但这并不能解决核心问题。您提到了server-side processing is also mostly the same(因此您同意它不同,但有点相似),所以我假设您对wagtail 内部了解很多?为什么不发布正确的答案?这个问题必须在框架的内部解决(wagtail),而不是被JavaScript掩盖。

标签: django python-3.x wagtail richtext


【解决方案1】:

创建文件 wagtail_hooks.py 并添加以下行:

class NewWindowExternalLinkHandler(LinkHandler):
    identifier = 'external'

    @classmethod
    def expand_db_attributes(cls, attrs):
        href = attrs["href"]
        return '<a href="%s" target="_blank" rel="noopener noreferrer">' % escape(href)

@hooks.register('register_rich_text_features')
def register_rich_text_handlers(features):
    features.register_link_type(NewWindowExternalLinkHandler)

【讨论】:

    最近更新 更多