如何在Wagtail 1.x中添加可全局使用的电话链接?
解决Wagtail 1.x全站段落文本自动添加电话链接的方案
嘿,针对你要把Wagtail 1.x站点里所有段落的纯文本电话转成tel:链接的需求,我整理了两个实用的方案,你可以根据自己的场景选择:
方案一:自定义模板过滤器(灵活可控)
这个方法适合你需要在特定模板里处理内容的场景,或者想快速测试效果的情况:
- 创建模板过滤器文件
在你的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)
- 在模板中使用过滤器
在渲染段落内容的模板文件里,把原来的内容渲染代码改成:
{% 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
相关产品推荐
相关产品推荐

