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

Wagtail技术问询:如何替换富文本输出的<b>/<i>为<strong>/<em>

解决Wagtail富文本输出/替代/的问题

你遇到的问题核心在于:Wagtail的富文本内容不是直接存储HTML,而是以结构化的JSON格式(Draftail编辑器的内容模型)存在content_json里。手动修改JSON里的<b>/<i>标签根本没用,因为richtext过滤器会根据结构化数据重新生成HTML,完全忽略你手动改的HTML片段。

下面给你几个可行的解决方案:

1. 自定义RichText过滤器,强制替换渲染标签

如果只是想快速改变前端输出的HTML标签,最直接的方式是重写Wagtail默认的richtext过滤器,修改它的标签映射规则:

步骤:

  • 在你的Django app下创建templatetags/wagtail_custom_filters.py文件:
from django import template
from wagtail.core.rich_text import expand_db_html, RichText

register = template.Library()

@register.filter(name='custom_richtext')
def custom_richtext(value):
    if isinstance(value, RichText):
        value = value.source
    # 先让Wagtail处理默认的结构化数据渲染
    html = expand_db_html(value)
    # 替换目标标签
    html = html.replace('<b>', '<strong>').replace('</b>', '</strong>')
    html = html.replace('<i>', '<em>').replace('</i>', '</em>')
    return html
  • 在模板里替换原来的{{ block.value|richtext }}为{{ block.value|custom_richtext }}

这个方法简单粗暴,适合快速解决输出问题,但要注意:如果Wagtail后续更新了富文本渲染逻辑,可能需要同步调整这个过滤器。

2. 批量修正数据库里的结构化内容

如果你想彻底修正已有的内容(让存储的结构化数据对应正确的标签),需要修改content_json里的编辑器实体,而不是手动改HTML片段:

步骤:

  • 创建一个Django管理命令(比如fix_richtext_tags.py):
from django.core.management.base import BaseCommand
from wagtail.core.models import PageRevision
import json

class Command(BaseCommand):
    help = 'Convert <b>/<i> related structures in PageRevision content_json to <strong>/<em>'

    def handle(self, *args, **options):
        revisions = PageRevision.objects.all()
        count = 0
        for revision in revisions:
            content = json.loads(revision.content_json)
            # 处理富文本字段(假设你的字段叫'body',根据实际项目调整)
            if 'body' in content:
                for block in content['body']:
                    if block['type'] == 'rich_text':
                        block_value = block['value']
                        # 针对旧编辑器存储的HTML片段直接替换
                        if 'html' in block_value:
                            block_value['html'] = block_value['html'].replace('<b>', '<strong>').replace('</b>', '</strong>')
                            block_value['html'] = block_value['html'].replace('<i>', '<em>').replace('</i>', '</em>')
                        # 针对Draftail的实体结构修正类型
                        if 'entities' in block_value:
                            for entity in block_value['entities']:
                                if entity['type'] == 'BOLD':
                                    # 注:Wagtail默认BOLD实体渲染就是<strong>,如果你的项目有自定义映射才需要改这里
                                    entity['type'] = 'STRONG'
                                elif entity['type'] == 'ITALIC':
                                    entity['type'] = 'EM'
                # 保存修改后的内容
                revision.content_json = json.dumps(content)
                revision.save()
                count += 1
        self.stdout.write(self.style.SUCCESS(f'Fixed {count} page revisions'))
  • 运行命令:python manage.py fix_richtext_tags

⚠️ 重要提醒:运行前一定要备份数据库!不同Wagtail版本的content_json结构可能不同,需要根据你实际的JSON结构调整代码。

3. 确保新内容使用正确的标签

为了避免新内容再出现<b>/<i>,检查你的Wagtail编辑器配置:

  • 在wagtail_hooks.py里,确保Draftail的features启用的是'bold'和'italic'(这两个默认对应<strong>和<em>),而不是自定义的'b'/'i':
from wagtail.admin.rich_text.editors.draftail import features as draftail_features
from wagtail.core import hooks

@hooks.register('register_rich_text_features')
def register_custom_features(features):
    # 确保启用默认的bold和italic
    features.default_features.append('bold')
    features.default_features.append('italic')

这样新创建的富文本内容,渲染后就会自动输出<strong>和<em>了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:44:44