如何使自定义模板过滤器不区分大小写? (Django 2.1)

时间:2019-01-29 00:14:51

标签: django

我的自定义模板过滤器会像在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>

结果是,过滤器仅突出显示与输入关键字大小写完全匹配的文本。如果用户键入“朝鲜战争”,则过滤器将不会突出显示“朝鲜战争”。如何使我的过滤器不区分大小写?

1 个答案:

答案 0 :(得分:2)

您必须使用正则表达式来实现此目的。

示例:

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)