django - 如何使自定义模板过滤器不区分大小写?(Django 2.1)
问题描述
我的自定义模板过滤器在结果页面中突出显示我的搜索引擎中的关键字,就像在 Google 上一样。
搜索引擎代码:
def query_search(request):
articles = cross_currents.objects.all()
search_term = ''
if 'keyword' in request.GET:
search_term = request.GET['keyword']
articles = articles.annotate(similarity=Greatest(TrigramSimilarity('Title', search_term), TrigramSimilarity('Content', search_term))).filter(similarity__gte=0.03).order_by('-similarity')
context = {'articles': articles, 'search_term': search_term}
return render(request, 'query_search.html', context)
自定义过滤器代码:
register = template.Library()
@register.filter(needs_autoescape=True)
@stringfilter
def highlight(value, search_term, autoescape=True):
return mark_safe(value.replace(search_term, "<span class='highlight'>%s</span>" % search_term))
HTML 模板:
<ul>
{% for article in articles %}
<li><a href="{% url 'search:article_detail' article.ArticleID %}">{{ article|highlight:search_term }}</a></li>
<p> {{ article.Content|highlight:search_term|truncatewords:2000 }} </p>
{% endfor %}
</ul>
结果是过滤器仅突出显示与输入关键字的大小写完全匹配的文本。如果用户输入“朝鲜战争”,过滤器不会突出显示“朝鲜战争”。如何使我的过滤器不区分大小写?
解决方案
您必须使用正则表达式来实现这一点。
例子:
import re
def highlight(value, search_term, autoescape=True):
# first compile the regex pattern using the search_term
pattern = re.compile(re.escape(search_term), re.IGNORECASE)
# now replace
new_value = pattern.sub('<span class="highlight">\g<0></span>', value)
return mark_safe(new_value)
推荐阅读
- haskell - 如何断言内部函数的类型取决于 Haskell 中外部函数的类型?
- scala - 是否有内置函数将 Int 限制为 Range?
- ruby-on-rails - Elasticsearch 6.2.4 [400] {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"文本为空 (可能是 HTTP/0.9)"}]
- python - 在pygame中检查碰撞和停止速度
- cypress - Cypress 通过 css 选择器获取元素标签名称
- c# - 在 C# 客户端应用程序中创建用户身份验证
- html - 用计数处理拆分列无序列表的Ruby方式?
- python - Python - 同时运行代码(TTS 和打印功能)
- c++ - 保留函数指针模板参数
- node.js - 如何在猫鼬的其他对象数组中更新特定对象的元素