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

在Python与Django中实现医疗术语自动搜索与链接生成

自动为Django动态页面中的医学术语生成链接/弹窗方案

嘿,这个需求在医疗类Django应用里太常见了!手动加链接确实效率极低,我给你整理几个落地性强的方案,都是实际项目里验证过的:


方案1:自定义模板过滤器(最省心的入门方案)

Django的模板过滤器可以直接在模板层面处理文本,不用改太多视图逻辑,适合快速上线。

步骤1:写自定义过滤器

在你的app下建个templatetags文件夹(别忘了加空的__init__.py),然后创建medical_helpers.py:

from django import template
from django.urls import reverse
from your_app.models import MedicalTerm  # 换成你的术语模型

register = template.Library()

@register.filter(name='link_terms')
def link_medical_terms(content):
    # 这里建议缓存术语列表,不然每次渲染都查DB太耗性能
    terms = MedicalTerm.objects.all()
    # 重要!按术语长度倒序排序,避免短术语先替换(比如先替换"高血压"再替换"血压")
    sorted_terms = sorted(terms, key=lambda x: -len(x.name))
    
    for term in sorted_terms:
        # 替换成带详情页链接的a标签,用reverse生成URL更规范
        link = f'<a href="{reverse("term_detail", args=[term.slug])}" class="medical-term">{term.name}</a>'
        content = content.replace(term.name, link)
    return content

步骤2:模板里用起来

在需要处理的页面模板顶部加载过滤器,然后把动态内容丢进去处理:

{% load medical_helpers %}

<div class="article-content">
    {# 这里的content是你从DB取的动态内容 #}
    {{ content|link_terms|safe }}
</div>

划重点:必须加|safe,不然Django会把HTML转义成纯文本,链接就失效了。如果要支持大小写不敏感匹配,把replace换成正则的re.sub就行。


方案2:视图层预处理(适合复杂匹配逻辑)

如果你的需求更复杂——比如要排除代码块、只匹配完整单词、或者需要根据用户权限控制是否显示链接,那在视图里处理会更灵活。

示例代码:

import re
from django.shortcuts import render
from django.urls import reverse
from your_app.models import MedicalTerm

def article_detail(request, pk):
    article = Article.objects.get(pk=pk)
    raw_content = article.content
    
    # 先拿术语列表,同样按长度倒序
    terms = sorted(MedicalTerm.objects.all(), key=lambda x: -len(x.name))
    # 用正则匹配完整单词,避免把"高血压"里的"血压"单独替换
    term_pattern = re.compile(r'\b(' + '|'.join(re.escape(t.name) for t in terms) + r')\b', re.IGNORECASE)
    
    # 定义替换逻辑
    def replace_term(match):
        term_name = match.group(0)
        # 因为忽略了大小写,所以用iexact找对应的术语
        term = MedicalTerm.objects.get(name__iexact=term_name)
        term_url = reverse("term_detail", args=[term.slug])
        # 保留原文本的大小写
        return f'<a href="{term_url}" class="medical-term">{term_name}</a>'
    
    # 执行替换
    processed_content = term_pattern.sub(replace_term, raw_content)
    
    return render(request, 'article/detail.html', {'content': processed_content})

模板里直接用{{ content|safe }}就好。


方案3:弹窗替代跳转(提升用户体验)

如果不想让用户跳来跳去,用弹窗展示术语解释会更友好,比如结合Bootstrap的模态框:

先改过滤器里的替换代码:

replacement = f'''
<span class="term-popover" data-term-id="{term.id}">{term.name}</span>
'''

然后在页面底部加一段JS(用jQuery举例子):

$(document).ready(function() {
    $('.term-popover').click(function() {
        const termId = $(this).data('term-id');
        // AJAX拉取术语详情
        $.get(`/terms/${termId}/ajax-detail/`, function(data) {
            // 把内容塞进模态框
            $('#termModal .modal-title').text(data.name);
            $('#termModal .modal-body').text(data.definition);
            // 弹出模态框
            $('#termModal').modal('show');
        });
    });
});

记得在模板里加Bootstrap模态框的基础HTML结构哦!


几个必做的优化

  • 缓存术语列表:用Django的cache框架把术语列表缓存1小时,更新术语时手动清缓存,不然每次渲染都查DB会拖慢页面。
  • 避免重复替换:如果内容里已经有链接,要写逻辑排除这些区域,比如用正则跳过<a>标签内的文本。
  • 处理术语冲突:比如“心肌梗死”和“梗死”,一定要按长度倒序排序,先替换长的术语,不然会出现错误替换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:19:31