Wagtail 6.3:带RichTextField的Snippet内部链接失效求助
问题原因
Wagtail中,非Page模型(如Snippet)的RichTextField内部链接默认无法自动解析为可跳转的URL。你当前使用的richtext过滤器无法充分利用模板上下文里的request、站点信息来匹配对应Page的实际地址,导致链接保留原始的<a id="1" linktype="page">My Page</a>格式,无法实现跳转。
解决方案
方案1:使用render_richtext标签替代richtext过滤器(推荐)
Wagtail 5.0及以上版本推荐使用render_richtext标签处理富文本内容,它会自动利用上下文信息解析内部链接。
修改你的article_snippet.html模板:
{% load wagtailcore_tags %} <div class="block-text"> {% if not value.hide_title %} <h2{% if value.title_id %} id="{{value.title_id}}"{% endif %}>{{ value.title }} </h2> {% endif %} <div>{% render_richtext value.content %}</div> </div>
将原有的{{ value.content|richtext }}替换为{% render_richtext value.content %}即可,该标签会自动将内部页面链接转换为带正确href属性的可跳转链接。
方案2:确保模板上下文包含request(兜底检查)
如果方案1不生效,需确认ArticlePage渲染时上下文包含request对象(Page模型默认会在get_context方法中传递request,若你自定义过该方法,需确保保留):
class ArticlePage(Page): # ... 其他字段定义 ... def get_context(self, request, *args, **kwargs): context = super().get_context(request, *args, **kwargs) # 确保request存在于上下文(默认已包含,若有自定义逻辑请勿移除) return context
方案3:自定义链接解析过滤器(备用)
若上述方法均不适用,可手动实现一个过滤器来解析内部链接:
- 在你的app目录下创建
templatetags/snippet_tags.py文件:
from django import template from wagtail.models import Page from wagtail.rich_text import RichText register = template.Library() @register.filter def resolve_internal_links(rich_text): if not isinstance(rich_text, RichText): return rich_text import re html_content = rich_text.source def replace_page_link(match): page_id = match.group(1) link_text = match.group(2) try: page = Page.objects.get(id=page_id) return f'<a href="{page.get_url()}">{link_text}</a>' except Page.DoesNotExist: return link_text processed_html = re.sub(r'<a id="(\d+)" linktype="page">(.*?)</a>', replace_page_link, html_content) return template.mark_safe(processed_html)
- 在模板中加载并使用自定义过滤器:
{% load wagtailcore_tags snippet_tags %} <div class="block-text"> {% if not value.hide_title %} <h2{% if value.title_id %} id="{{value.title_id}}"{% endif %}>{{ value.title }} </h2> {% endif %} <div>{{ value.content|resolve_internal_links }}</div> </div>
验证
修改完成后重新渲染页面,内部链接应显示为<a href="/path/to/my-page/">My Page</a>格式,可正常跳转。
内容的提问来源于stack exchange,提问作者DavidU
相关产品推荐
相关产品推荐

