【问题标题】:Django display search resultsDjango 显示搜索结果
【发布时间】:2018-06-16 16:51:29
【问题描述】:

我目前正在使用 Django 开发博客应用程序。作为所有博客应用程序,我需要一个搜索表单。因此,我编写了一个小视图和上下文处理器(以使搜索表单在全球范围内可用)来查询搜索结果:

view.py:

class BlogSearchListView(ListView):
    model = Post
    paginate_by = 10
    def get_queryset(self):
        qs = Post.objects.published()
        keywords = self.request.GET.get('q')
        if keywords:
            query = SearchQuery(keywords)
            title_vector = SearchVector('title', weight='A')
            content_vector = SearchVector('content', weight='B')
            tag_vector = SearchVector('tag', weight='C')
            vectors = title_vector + content_vector + tag_vector
            qs = qs.annotate(search=vectors).filter(search=query)
            qs = qs.annotate(rank=SearchRank(vectors, query)).order_by('-rank')
        return qs

base.html:

    <div class="globalsearch">
        <form id="searchform" action="{% url 'search' %}" method="get" accept-charset="utf-8">
            <label for="{{ categorysearch_form.category.id_for_label }}">In category: </label>
            {{ categorysearch_form.category }}
            <input class="searchfield" id="searchbox" name="q" type="text" placeholder="Search for ...">
            <button class="searchbutton" type="submit">
                <i class="fa fa-search"></i>
            </button>
        </form>
    </div>

settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'quickblog.quickblog.context_processors.categorysearch_form',
)

context_processors.py

from .forms import PostForm

def categorysearch_form(request):
    form = PostForm()
    return {'categorysearch_form': form}

post_list.html:

{% extends 'quickblog/base.html' %}

{% block content %}
    {% for post in posts %}
        <div class="post">
            <h1><u><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></u></h1>
            <p>{{ post.content|linebreaksbr }}</p>
            <div class="date">
                <a>Published by: {{ post.author }}</a><br>
                <a>Published at: {{ post.published_date }}</a><br>
                <a>Category: {{ post.category }}</a><br>
                <a>Tag(s): {{ post.tag }}</a>
            </div>
        </div>
    {% endfor %}

    <div>
        <span>
         {% if posts.has_previous %}
            <a href="?page=1">&laquo; First <a> |</a></a>
            <a href="?page={{ posts.previous_page_number }}">Previous</a>
        {% endif %}
        {% if posts.has_next %}
            <span> Page {{ posts.number }} of {{ posts.paginator.num_pages }}.</span>
            <a href="?page={{ posts.next_page_number }}">Next<a> |</a></a>
            <a href="?page={{ posts.paginator.num_pages }}">Last &raquo;</a>
        {% endif %}
       </span>
   </div>
{% endblock %}

项目的其余部分可以在这里查看:https://github.com/rsmvdl/quickblog

我现在希望以与它们在我的 post_list.html 视图中显示相同的方式呈现结果,并增加一个细节:我希望用户搜索的单词在搜索结果中突出显示,以便用户能够尽快获取内容的上下文;)。我希望得到任何创造性的想法。谢谢。

【问题讨论】:

  • 您可以创建自定义模板标签或过滤器,在您希望突出显示的任何单词周围插入 HTML 标签。
  • 这也意味着用户搜索的实际字符串对吗?你能举个例子吗?
  • 我已经发布了一个答案,希望能让你走上正轨。
  • 我首先需要了解如何显示实际的搜索结果,这是我的第一点。我想我在这里迷路了。
  • 您可以使用视图的get_context_data() 函数将您需要的任何内容添加到模板的上下文中,例如搜索结果。

标签: django templates search


【解决方案1】:

您可以创建custom template filter 以在帖子标题或内容中的搜索词周围添加 HTML 标记。这不是一个精确的解决方案,但您应该能够适应它:

@register.filter
@stringfilter
def highlight_search_term(text, search_term):
    if search_term in text:
        text.replace(search_term, '<span class="highlight">' + search_term + '</span>')
    return mark_safe(text)

然后,您可以使用 {{ post.title|highlight_search_term:search_term }} 将此过滤器应用于您的帖子标题或模板中的内容。

您还需要将search_term 传递给您的模板上下文,以便过滤器知道要突出显示的内容。如果您将其应用于用户提交的内容,请小心 mark_safe()

【讨论】:

  • 如何在模板中传递search_term?
【解决方案2】:

您可以创建上下文处理器并将request.GET.get('q') 作为上下文传递。

context_processors.py

def search(request):
    search_keyword = request.GET.get('q')
    context = {'search_keyword': search_keyword}
    return context

并在您的模板中以{{ search_keyword }} 访问它

search_results.html

<h3>Showing results for: {{ search_keyword }}</h3>

【讨论】:

    猜你喜欢
    • 2018-07-26
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2023-04-07
    • 2013-01-14
    • 2014-01-20
    相关资源
    最近更新 更多