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
相关产品推荐
相关产品推荐

