【问题标题】:Adapt wagtail tag filter to include an operator so multiple tags can be searched调整 wagtail 标签过滤器以包含一个运算符,以便可以搜索多个标签
【发布时间】:2019-09-12 11:51:43
【问题描述】:

我的 Wagtail 模板上有一个有效的搜索表单,可以根据标签查找页面,但由于没有运算符(ANDOR),一次只能搜索一个标签。

有人可以告诉我如何调整此代码以允许多个标签搜索吗?

models.py

    tag_posts = PostsPage.objects.live().public().order_by('-first_published_at')


    if request.GET.get('tag', None):
        tags = request.GET.get('tag')
        tag_posts = tag_posts.filter(tags__slug__in=[tags])

        # Paginate all posts by 2 per page
        paginator = Paginator(tag_posts, 2)

        # Try to get the ?page=x value
        page = request.GET.get("page")
        try:
            posts = paginator.page(page)
        except PageNotAnInteger:
            posts = paginator.page(1)
        except EmptyPage:
            posts = paginator.page(paginator.num_pages)

        context["posts"] = tag_posts

        return context

search_page.html

            <form role="search" method="get" class="form-search" action="posts" method="get">
                <div class="input-group">
                    <input type="text" class="form-control search-query" name="tag" placeholder="What are you after?" title="Search for:" />
                    <span class="input-group-btn">
                      <button type="submit" class="btn btn-default" name="" id="searchsubmit" value="">
                        <span class="btn btn-default">GO</span>
                      </button>
                    </span>
                </div>
            </form>

【问题讨论】:

    标签: python django search tags wagtail


    【解决方案1】:

    您需要允许用户输入由逗号(或您选择的任何其他分隔符)分隔的多个标签。下面的代码允许使用逗号、分号和竖线作为分隔符。它不使用空格作为分隔符,因为 taggit 的标签可以是多个单词。

    我会改变:

    tag_posts = PostsPage.objects.live().public().order_by('-first_published_at')
    
    if request.GET.get('tag', None):
        tags = request.GET.get('tag')
        tag_posts = tag_posts.filter(tags__slug__in=[tags])
    

    到:

    tag_string = request.GET.get('tag', None)
    if tag_string:
        tags = re.split('[,;|]', tag_string.lower())
        tag_ids = Tag.objects.annotate(name_lower=Lower('name')).filter(name_lower__in=tags).values_list('id', flat=True)
        tag_posts = PostsPage.objects.live().public().filter(tags__in=tag_ids).order_by('-first_published_at')
    

    请注意,以上选择不区分大小写的标签名称,而不是 slug 值。

    也这样做:

    import re
    from django.db.models.function import Lower
    

    【讨论】:

    • 非常感谢您的回复丹。我已经尝试了您的建议,但恐怕现在我没有得到任何结果(也确保重新导入)。你有什么想法吗?
    • 感谢更新您的答案丹,我现在可以使用搜索添加多个标签,只要我使用逗号且没有空格。但是,我需要一种自动删除空格并添加逗号的方法,否则用户将得不到任何结果。您认为这是可能的吗,还是我必须重新考虑我的方法并可能使用 haystack / elasticsearch?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2015-12-26
    • 2015-05-22
    • 2019-07-18
    • 2022-12-12
    • 2014-11-25
    相关资源
    最近更新 更多