如何在 Django 模板的结果页面中突出显示搜索到的查询?

Bas*_*nda 4 css python django

我有以下搜索查询views.py

class SearchView(View):
    def get(self, request, *args, **kwargs):
        queryset = BlogPost.objects.all()
        query = request.GET.get('q')
        if query:
            queryset = queryset.filter(
                Q(title__icontains=query) |
                Q(content__icontains=query)
            ).distinct()
        context = {
            'queryset': queryset,
            'query': query,
        }
        return render(request, 'blogs/search_result.html', context)
Run Code Online (Sandbox Code Playgroud)

如果我搜索Tesla结果模板中显示的结果如下所示的单词:

在此处输入图片说明

请帮助我,如何在 Django 模板中以黄色突出显示搜索到的查询?谢谢你的帮助!

编辑:这是带有搜索框的模板代码

<div class="card my-4">
    <div class="card-body">
        <div class="card-title">Search blog</div>
        <form action="{% url 'blog:search_blog' %}">
            {% csrf_token %}
            <input type="text" class="form-control" name="q" placeholder="What are you looking for?">
            <input type="submit" value="Search" class="btn btn-success btn-sm mt-3">
        </form>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

这是 result_search 的模板

{% block content %}
<div class="container bg-light w-100">
    <h2 class="display-6 border-bottom py-3">Results for "{{ query }}"</h2>
    {% for post in queryset %}
    <div class="my-1">
        <a class="link" href="{{ post.get_absolute_url }}">{{ post.title }}</a>
    </div>
    {% endfor %}
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑 2:丹尼尔罗斯曼先生,这是下面我用黄色突出显示的 html。 在此处输入图片说明

Dan*_*man 8

您可以在模板过滤器中执行此操作。就像是:

@register.filter
def highlight_search(text, search):
    highlighted = text.replace(search, '<span class="highlight">{}</span>'.format(search)
    return mark_safe(highlighted)
Run Code Online (Sandbox Code Playgroud)

现在在您的模板中,您可以执行以下操作:

{% load my_tags %} # wherever you put the template filter

{% for post in queryset %}
<div class="my-1">
    <a class="link" href="{{ post.get_absolute_url }}">{{ post.title|highlight_search:query }}</a>
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

您需要将 search_text 与呈现结果页面的上下文一起发送回去。

  • 如果它对任何人都有用,要进行不区分大小写的匹配,请将第三行替换为: `highlighted = re.sub('(?i)(%s)' % (re.escape(search)), '&lt;span class="highlight"&gt;\\1&lt;/span&gt;', text)` (2认同)