Py学习  »  Django

在django中对搜索结果进行排序

Frank • 3 年前 • 1799 次点击  

我有一个函数,返回一个查询集和一个带有结果的html文件,

def get_queryset(self): # new
        query = self.request.GET.get('q')
        sort = '-date'
        post_list = Post.objects.filter(
            Q(title__icontains=query) #| Q(title__icontains=query) another field
        ).order_by(sort)
        return post_list

表格:

<form class="form-inline my-2 my-lg-0" action="{% url 'search_results' %}" method="get">
      <input class="form-control" name="q" type="text" placeholder="חפש מאמרים">
      <button class="btn btn-outline-success my-sm-0" type="submit">חפש</button>
    </form>

在结果模板中,我希望有几个链接可以按日期、投票等进行排序。。。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/131452
文章 [ 2 ]  |  最新文章 3 年前
Willem Van Onsem
Reply   •   1 楼
Willem Van Onsem    3 年前

请不要允许任意排序:这是一个安全漏洞,因为用户可以根据文章作者的性别进行排序 Post ,这可能是您想要保护的数据。你应该列出一系列可接受的选择,因此:

def get_queryset(self):
    query = self.request.GET.get('q')
    sort = self.request.GET.get('order_by', '-date')
    if sort not in ['date', '-date', 'votes', '-votes']:
        sort = '-date'
    return Post.objects.filter(
        Q(title__icontains=query) | Q(title__icontains=query)
    ).order_by(sort)

然后,url应该如下所示:

<a href="{% url 'search' %}?q={{ query|urlencode }}&amp;order_by=-votes">votes</a>

具有 'search' 指向此视图的路径的名称。


笔记 :也许值得一看 django-filter  [GitHub] 基于 QueryDict 以更具陈述性的方式。

Işık Kaplan
Reply   •   2 楼
Işık Kaplan    3 年前

您可以编写一个小get表单,通过名为order的查询参数添加相关的order。

?order_by=-date
?order_by=score
?order_by=author

把这些带到视野中 request.GET.get("order_by")

或者您可以使用以下库:

https://django-filter.readthedocs.io/en/stable/ref/filters.html