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

如何在Wagtail 1.x中添加可全局使用的电话链接?

解决Wagtail 1.x全站段落文本自动添加电话链接的方案

嘿,针对你要把Wagtail 1.x站点里所有段落的纯文本电话转成tel:链接的需求,我整理了两个实用的方案,你可以根据自己的场景选择:

方案一:自定义模板过滤器(灵活可控)

这个方法适合你需要在特定模板里处理内容的场景,或者想快速测试效果的情况:

  1. 创建模板过滤器文件
    在你的Django app里新建templatetags/phone_tags.py文件,写入以下代码(可以根据你的电话号码格式调整正则表达式):
from django import template
import re

register = template.Library()

# 匹配常见的电话格式,比如+1-555-555-5555、555-555-5555
PHONE_PATTERN = re.compile(r'(\+?\d{1,3}-?)?(\d{3}-?\d{3}-?\d{4})')

@register.filter(name='phone_links')
def phone_links(text):
    def replace_match(match):
        # 去掉链接里的分隔符,保证tel:格式正确
        full_number = match.group(0).replace('-', '')
        # 保留原格式显示给用户
        display_number = match.group(0)
        return f'<a href="tel:{full_number}">{display_number}</a>'
    return PHONE_PATTERN.sub(replace_match, text)
  1. 在模板中使用过滤器
    在渲染段落内容的模板文件里,把原来的内容渲染代码改成:
{% load phone_tags %}
{{ page.body|phone_links|safe }}

这里的|safe过滤器是告诉Django这段生成的HTML是安全的,不会被转义。

方案二:全局RichText内容处理(全站自动生效)

如果你希望所有RichTextField的内容都自动处理电话链接,不用逐个修改模板,可以用这个方法:

在你的项目里新建wagtail_hooks.py文件,写入以下代码:

from wagtail.core.rich_text import expand_db_html
import re

# 同样可以根据需求调整正则
PHONE_PATTERN = re.compile(r'(\+?\d{1,3}-?)?(\d{3}-?\d{3}-?\d{4})')

def add_phone_links(html):
    def replace_match(match):
        full_number = match.group(0).replace('-', '')
        display_number = match.group(0)
        return f'<a href="tel:{full_number}">{display_number}</a>'
    return PHONE_PATTERN.sub(replace_match, html)

# 替换Wagtail默认的RichText扩展函数,实现全局处理
original_expand_db_html = expand_db_html

def custom_expand_db_html(html):
    # 先执行Wagtail原本的HTML扩展逻辑
    expanded_html = original_expand_db_html(html)
    # 再添加电话链接处理
    return add_phone_links(expanded_html)

expand_db_html = custom_expand_db_html

这样所有RichTextField在渲染时都会自动把匹配到的电话号码转换成tel链接,无需修改任何模板。

注意事项

  • 正则表达式调整:上面的正则只匹配了常见的带连字符的格式,如果你的站点有其他格式(比如带括号(555)555-5555、空格分隔等),需要修改正则表达式来适配。
  • XSS风险:如果你的站点允许普通用户编辑内容,要注意过滤危险内容,不过如果只有管理员编辑,使用|safe或者全局处理都是安全的。
  • Wagtail 1.x兼容性:Wagtail 1.x的RichText处理逻辑和新版本略有不同,上面的代码是针对1.x版本编写的,测试后可以正常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:50:35