如何使用django突出显示文本栏中的特定单词?

时间:2019-07-23 02:14:26

标签: django

所以说我有3列。

文字|主题|连接器

癌症是由风车引起的。癌症,风车|由

引起

这些都保存在postgreSQL数据库中。如何在文本中突出显示“癌症和风车”(由主题引起)和“由连接器引起”(由连接器引起),并将其显示在网页上?

{% if db.cause and db.connector in db.text %}
<td><mark>{{ db.text }}</mark></td>

但这突出显示了整个文本,而不是癌症,风车和由之引起的那四个字。

根据@selcuk的建议进行更新:

在templatetags / filters.py中:

@register.filter
def highlight(text, search):
    highlighted = text.replace(search, '<mark>{}</mark>'.format(search))
    return mark_safe(highlighted)

在page.html中:

{% for db in context %}
  {% if db.cause and db.connector in db.text %}
  {% with cause=db.cause %}
  <td style="word-wrap: break-all">{{ db.text|highlight:cause }}</td>
  {% endwith %}
  {% else %}
  <td style="word-wrap: break-all">{{ db.text }}</td>
  {% endif %}

最终结果:什么都没有突出显示,也没有错误消息。

所需输出:仅突出显示由风车引起的癌症

1 个答案:

答案 0 :(得分:1)

Replace()已更改为re.sub,因为replace()无法处理不区分大小写的单词/字符。

在templatetags / filters.py中:

from django import template
from django.utils.safestring import mark_safe
import re

register = template.Library()

@register.filter
def highlight(text, search):
    search = re.split((" "), search)

    for i in search:
        highlighted = re.sub(i, '<span style="background-color: #000FF">{}</span>'.format(i), text, flags=re.IGNORECASE)
        text = highlighted
    return mark_safe(text)